请教关于CreateFile的入门级问题

jimmy0524   2009-12-30 16:10 楼主
// 打开 驱动
hFlashFile = CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);

我想请问我如何在com驱动中知道我打开的是COM1,还是其他COM,比如COM2/3
我想在驱动中获得打开了什么,然后我好根据这个com做一些事情,
请问这个如何做的?
这个问题很简单吧,可是俺不会,大伙指点一下我吧。3Q

回复评论 (44)

嘿嘿, 入门级的问题就有 100 分, 大手笔

这个问题不是很简单, 我也是搞了快 3, 4 年才搞清楚

Driver 是根据 COM_Init 中的第一个 parameter 字串所指向的 registry 来知道自己的 ioaddress, irq....etc., 至於该次是 COM1 还是 COM2, 通常 driver 不是很 care, 但是当然也可以在该 registry 中得到该资讯.


Paul, Chao @ Techware
点赞  2009-12-30 16:15
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);

文本那里需要去掉那个':'号,



打开了串口接下来就可以对串口进行操作了。

设置串口参数,收发数据等等
点赞  2009-12-30 16:16
引用: 引用 1 楼 paul_chao 的回复:
嘿嘿, 入门级的问题就有 100 分, 大手笔

这个问题不是很简单, 我也是搞了快 3, 4 年才搞清楚

Driver 是根据 COM_Init 中的第一个 parameter 字串所指向的 registry 来知道自己的 ioaddress, irq....etc., 至於该次是 COM1 还是 COM2, 通常 driver 不是很 care, 但是当然也可以在该 registry 中得到该资讯.


Paul, Chao @ Techware


我没有看到有.................噢噢,我自己加入,读出来即可。呵呵。

Paul, Chao @ Techware你总是让我很惊喜。
点赞  2009-12-30 16:17
引用: 引用 2 楼 rzsheng 的回复:
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);

文本那里需要去掉那个':'号,


打开了串口接下来就可以对串口进行操作了。

设置串口参数,收发数据等等

引用: 引用 2 楼 rzsheng 的回复:
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);

文本那里需要去掉那个':'号,


打开了串口接下来就可以对串口进行操作了。

设置串口参数,收发数据等等


噢噢噢,我想大家都误解我的意思了!

这个hFlashFile = CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
我当然知道是COM1
但是我要在驱动中知道打开的是COM1,驱动并没有这个和CreateFile的接口的
Paul, Chao @ Techware 的COM_Init方法也不行,因为COM_Init函数是在注册表加载的时候就调用了,我要的是应用中CreateFile 执行的时候获得是COM1,怎么获得?


还有
点赞  2009-12-30 16:23
引用: 引用 3 楼 gooogleman 的回复:
引用 1 楼 paul_chao 的回复:
Driver 是根据 COM_Init 中的第一个 parameter 字串所指向的 registry 来知道自己的 ioaddress, irq....etc., 至於该次是 COM1 还是 COM2, 通常 driver 不是很 care, 但是当然也可以在该 registry 中得到该资讯.


Paul, Chao @ Techware



我没有看到有.................噢噢,我自己加入,读出来即可。呵呵。

Paul, Chao @ Techware你总是让我很惊喜。


嘿嘿, lz 可能還沒有搞懂我的意思

要過年了, 好好回一篇吧, 記得有人說過《實踐是檢驗真理的唯一標準》, LZ 有興趣做個實驗吧:

DWORD XXX_Init(LPCTSTR pContext)
{
   RETAILMSG(1, (TEXT("XXX_Init(%s)+\r\n"), pContext));
}

您看看印出來的值就知道我在說什麼了.

Paul, Chao @ Techware
点赞  2009-12-30 16:27
哎呀呀, 按太快了, 忘了转简体

嘿嘿, lz 可能还没有搞懂我的意思


要过年了, 好好回一篇吧, 记得有人说过《实践是检验真理的唯一标准》, LZ 有兴趣做个实验吧:

DWORD XXX_Init(LPCTSTR pContext)
{
  RETAILMSG(1, (TEXT("XXX_Init(%s)+\r\n"), pContext));
}

您看看印出来的值就知道我在说什麽了.

Paul, Chao @ Techware
点赞  2009-12-30 16:29
已经打开的串口,再去打开会失败!
点赞  2009-12-30 16:29
哈哈
点赞  2009-12-30 16:31
通知一下驱动就行了,比如消息,或者事件等等都能实现
点赞  2009-12-30 16:32
引用: 引用 4 楼 gooogleman 的回复:
引用 2 楼 rzsheng 的回复:
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);

文本那里需要去掉那个':'号,


打开了串口接下来就可以对串口进行操作了。

设置串口参数,收发数据等等


引用 2 楼 rzsheng 的回复:
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);

文本那里需要去掉那个':'号,


打开了串口接下来就可以对串口进行操作了。

设置串口参数,收发数据等等


噢噢噢,我想大家都误解我的意思了!

这个hFlashFile = CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
我当然知道是COM1
但是我要在驱动中知道打开的是COM1,驱动并没有这个和CreateFile的接口的
Paul, Chao @ Techware 的COM_Init方法也不行,因为COM_Init函数是在注册表加载的时候就调用了,我要的是应用中CreateFile 执行的时候获得是COM1,怎么获得?


还有

creatfile 以后是先走XXX_init,如果你在platform.bib 和 reg中加入了对应的东西就会在系统启动的时候自动运行。
一般的情况下,完成init后会进入xxx_open xxx_close
xxx_powerup down 则是在你唤醒休眠前后会使用到,这个在电源管理的部分系统会自己去叫

另外如果你在驱动的init中加入中断响应部分, XXX_OPEN.CLOSE不会跑到。

再另外。有个XXX.def。这个地方其实是入口。。。。

个人建议 仅供参考。

Mercury
点赞  2009-12-30 16:33
引用: 引用 5 楼 paul_chao 的回复:
引用 3 楼 gooogleman 的回复:
引用 1 楼 paul_chao 的回复:
  Driver 是根据 COM_Init 中的第一个 parameter 字串所指向的 registry 来知道自己的 ioaddress, irq....etc., 至於该次是 COM1 还是 COM2, 通常 driver 不是很 care, 但是当然也可以在该 registry 中得到该资讯.


  Paul, Chao @ Techware


  我没有看到有.................噢噢,我自己加入,读出来即可。呵呵。

  Paul, Chao @ Techware你总是让我很惊喜。


嘿嘿, lz 可能還沒有搞懂我的意思

要過年了, 好好回一篇吧, 記得有人說過《實踐是檢驗真理的唯一標準》, LZ 有興趣做個實驗吧:

DWORD XXX_Init(LPCTSTR pContext)
{
?  RETAILMSG(1, (TEXT("XXX_Init(%s)+\r\n"), pContext));
}

您看看印出來的值就知道我在說什麼了.

Paul, Chao @ Techware

正解。不用在说什么了。。。
点赞  2009-12-30 16:38
对,最简单的办法就是再次打开就会报错。嘿嘿。。。
点赞  2009-12-30 16:45
汗,我还是不懂,
XXX_Init是会有这个信息,这个我早就知道了,但是我不要这里的信息,
是不是我说的大家没有明白呢。

我要CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
传给驱动的信息。因为我的应用是没有源码的。

只要加载注册表,XXX_Init就会执行,这个没有意义,

估计要钩子才行。

点赞  2009-12-30 16:46
引用: 引用 13 楼 gooogleman 的回复:
汗,我还是不懂,
XXX_Init是会有这个信息,这个我早就知道了,但是我不要这里的信息,
是不是我说的大家没有明白呢。

我要CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
传给驱动的信息。因为我的应用是没有源码的。

只要加载注册表,XXX_Init就会执行,这个没有意义,

估计要钩子才行。

你这个createfile到底是在AP还是在驱动上?
点赞  2009-12-30 16:50
CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
是打开COM1,我要他打开这个的时候,在驱动中接收到这个COM1信息,立即启动一个进程,其他COM不执行。

CreateFile 执行后不会去调用XXX_Init的吧?!——注册表加载时候才去执行XXX_Init
点赞  2009-12-30 16:50
不知道GM大哥是不是说的这个意思,你用的COM1,但是你没办法再去取得他,因为再去createfile就失败了。。你看可不可以这样:从注册表中读出所有的串口列表,然后再去挨个createfile,失败的那个,应该就是你现在正用的那个了。如果你同时在用几个串口那就没办法了。前段时间写了一个从注册表读串口的一段代码,希望能帮到你。

bool CPcPDlg::getComPort(void)
{
//combox_control_name为下拉列表CComboBox型的control变量
        HKEY hkey;
        int index=0;
        WCHAR valueBuff[256];
        DWORD valueSize;
        WCHAR nameBuff[256];
        DWORD nameSize;
        DWORD type;

        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\",0,KEY_READ,&hkey)==ERROR_SUCCESS){
                while(RegEnumValue(hkey,index,nameBuff,&nameSize,NULL,&type,(LPBYTE)valueBuff,&valueSize)==ERROR_SUCCESS){
                        index++;
                        valueSize=256;
                        nameSize=256;
                        combox_control_name.AddString(valueBuff);
                }
        }

        if (index==0)
        {
                AfxMessageBox(L"没有找到可用串口");
                return false;
        }

        combox_control_name.SetCurSel(0);//
        return true;
}
点赞  2009-12-30 16:51
createfile在应用上啊,
点赞  2009-12-30 16:51
引用: 引用 16 楼 jjyyhema 的回复:
不知道GM大哥是不是说的这个意思,你用的COM1,但是你没办法再去取得他,因为再去createfile就失败了。。你看可不可以这样:从注册表中读出所有的串口列表,然后再去挨个createfile,失败的那个,应该就是你现在正用的那个了。如果你同时在用几个串口那就没办法了。前段时间写了一个从注册表读串口的一段代码,希望能帮到你。

bool CPcPDlg::getComPort(void)
{
//combox_control_name为下拉列表CComboBox型的control变量
HKEY hkey;
int index=0;
WCHAR valueBuff[256];
DWORD valueSize;
WCHAR nameBuff[256];
DWORD nameSize;
DWORD type;

if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\",0,KEY_READ,&hkey)==ERROR_SUCCESS){
while(RegEnumValue(hkey,index,nameBuff,&nameSize,NULL,&type,(LPBYTE)valueBuff,&valueSize)==ERROR_SUCCESS){
index++;
valueSize=256;
nameSize=256;
combox_control_name.AddString(valueBuff);
}
}

if (index==0)
{
AfxMessageBox(L"没有找到可用串口");
return false;
}

combox_control_name.SetCurSel(0);//
return true;
}


3q ,不过不行。因为我的应用时没有源码的。难题在这里,不然我在应用直接操作了。

点赞  2009-12-30 16:53
引用: 引用 17 楼 gooogleman 的回复:
createfile在应用上啊,

自己写个串口打开的程序测测。一个个打开过去就知道了。。。不是有串口调试助手吗。。。如果串口被打开了就不能重复打开的。哎。。。
点赞  2009-12-30 16:56
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复