一个串口监视的小问题

BugHappy 2009-06-26 10:44:41
程序是这样的:
CreateFile打开串口(异步方式)
配置dcb,缓冲长度,超时等。。
PurgeComm();
ClearCommError();

然后创建结构OVERLAPPED变量ov,并
ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
SetCommMask(串口句柄, EV_XRCHAR); //设置事件掩码,这里只用了EV_XRCHAR。

DWORD dwEvtMask;
while(true)
{
WaitCommEvent(串口句柄,&dwEvtMask, &ov);
如果GetLastError() == ERROR_IO_PENDING
{
WaitForSingleObject(ov.hEvent, 10000);
然后是根据dwEvtMask的值,做不同的处理的switch语句,就像这样:
switch(dwEvtMask)
{
case xxxx: 某种处理。。
case xxxx: 某种处理。。。
}
}
}
程序完,好笑的事情来了。在WaitForSingleObject()等待的10秒内,明明发生了串口接收到数据的事件。
可WaitForSingleObject()函数就是不返回,非要等到10秒超时后才返回,
返回之后,我查dwEvtMask的值,的确等于0x01,也就是EV_XRCHAR的值。
而且这是用ReadFile读出串口缓冲的内容,也是正确的字符串:“123”。(我用另外一台机,在串口上发的)

我肯定是哪里理解错误,请各位不吝赐教~~谢谢




}
...全文
47 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
瓶盒 2009-06-27
  • 打赏
  • 举报
回复
WaitForSingleObject(ov.hEvent, 10000); 换成GetOverlappedResult(串口句柄,&ov,&dwLength, TRUE);试下
BugHappy 2009-06-27
  • 打赏
  • 举报
回复
哎呀呀,不好意思,我自己出了笔误,把本来正确的程序弄错了。。恐怕还误导了bottlebox

我帖子里写的是:
....
WaitCommEvent(串口句柄,&dwEvtMask, &ov);
如果GetLastError() == ERROR_IO_PENDING
{
WaitForSingleObject(ov.hEvent, 10000);
....

我自己实际程序里写成:
WaitForSingleObject(串口句柄,10000)
了。。

结果当然不会返回。nnd编译也不报错。晕死!
55555555555555555555
BugHappy 2009-06-27
  • 打赏
  • 举报
回复
to bottlebox

改为GetOverlappedResult(..,true),在收到数据后,函数就会返回。
此问题基本搞定。谢谢~~~~~~
driverstudent 2009-06-27
  • 打赏
  • 举报
回复

mark
BugHappy 2009-06-27
  • 打赏
  • 举报
回复
好主意啊,都怪我学的不熟,居然忘了GetOverlappedResult这个东西。。- -b
明天来告诉结果,现在家里只有一台电脑

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧