// 打开 驱动
hFlashFile = CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
我想请问我如何在com驱动中知道我打开的是COM1,还是其他COM,比如COM2/3
我想在驱动中获得打开了什么,然后我好根据这个com做一些事情,
请问这个如何做的?
这个问题很简单吧,可是俺不会,大伙指点一下我吧。3Q
嘿嘿, 入门级的问题就有 100 分, 大手笔
这个问题不是很简单, 我也是搞了快 3, 4 年才搞清楚
Driver 是根据 COM_Init 中的第一个 parameter 字串所指向的 registry 来知道自己的 ioaddress, irq....etc., 至於该次是 COM1 还是 COM2, 通常 driver 不是很 care, 但是当然也可以在该 registry 中得到该资讯.
Paul, Chao @ Techware
应该是 COM1
但有一个地方得改一下:
hFlashFile = CreateFile(TEXT("COM1"), ...);
文本那里需要去掉那个':'号,
打开了串口接下来就可以对串口进行操作了。
设置串口参数,收发数据等等
引用: 引用 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你总是让我很惊喜。
引用: 引用 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,怎么获得?
还有
引用: 引用 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
哎呀呀, 按太快了, 忘了转简体
嘿嘿, lz 可能还没有搞懂我的意思
要过年了, 好好回一篇吧, 记得有人说过《实践是检验真理的唯一标准》, LZ 有兴趣做个实验吧:
DWORD XXX_Init(LPCTSTR pContext)
{
RETAILMSG(1, (TEXT("XXX_Init(%s)+\r\n"), pContext));
}
您看看印出来的值就知道我在说什麽了.
Paul, Chao @ Techware
通知一下驱动就行了,比如消息,或者事件等等都能实现
引用: 引用 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
引用: 引用 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
正解。不用在说什么了。。。
汗,我还是不懂,
XXX_Init是会有这个信息,这个我早就知道了,但是我不要这里的信息,
是不是我说的大家没有明白呢。
我要CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
传给驱动的信息。因为我的应用是没有源码的。
只要加载注册表,XXX_Init就会执行,这个没有意义,
估计要钩子才行。
引用: 引用 13 楼 gooogleman 的回复:
汗,我还是不懂,
XXX_Init是会有这个信息,这个我早就知道了,但是我不要这里的信息,
是不是我说的大家没有明白呢。
我要CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
传给驱动的信息。因为我的应用是没有源码的。
只要加载注册表,XXX_Init就会执行,这个没有意义,
估计要钩子才行。
你这个createfile到底是在AP还是在驱动上?
CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
是打开COM1,我要他打开这个的时候,在驱动中接收到这个COM1信息,立即启动一个进程,其他COM不执行。
CreateFile 执行后不会去调用XXX_Init的吧?!——注册表加载时候才去执行XXX_Init
不知道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;
}
引用: 引用 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 ,不过不行。因为我的应用时没有源码的。难题在这里,不然我在应用直接操作了。
引用: 引用 17 楼 gooogleman 的回复:
createfile在应用上啊,
自己写个串口打开的程序测测。一个个打开过去就知道了。。。不是有串口调试助手吗。。。如果串口被打开了就不能重复打开的。哎。。。