请教:事件驱动I/0方式读串口的超时问题

ashamwolf 2005-08-02 03:23:07
SetCommMask(hComm,EV_RXHAR);
if(WaitCommEvent(hComm,&dwEvent,NULL))
{
//读串口
}

现在的问题是:如果串口没有数据送过来,程序就会在WaitCommEvent这里一直停住了,SetCommTimeouts设置的超时对WaitCommEvent不起作用,怎么样才能让WaitCommEvent在超时之后跳过呢?除了另外设置定时器还有没有更简单的方法?

哪位老兄指点一下,多谢了!!!
...全文
389 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ashamwolf 2005-08-14
  • 打赏
  • 举报
回复
jiajun2001(嘉俊),你的代码在2000和xp里面没问题,但是在98和NT里面运行的话,WaitForSingleObject总是返回超时。有什么办法可以解决吗?
Jagen在路上 2005-08-05
  • 打赏
  • 举报
回复
不用异步方式打开的话,就没有超时可供你设置
qinxiaogang 2005-08-03
  • 打赏
  • 举报
回复
WaitCommEvent: 都是用在线程里的.主程序当然不能用!
ashamwolf 2005-08-03
  • 打赏
  • 举报
回复
如果串口设备还没处理完第一个命令就不能再向它发送第二个命令,这样的情况应该不能用异步方式来打开串口吧
Jagen在路上 2005-08-02
  • 打赏
  • 举报
回复
那么建议楼主使用重叠I/O
首先使用FILE_FLAG_OVERLAPPED标志打开你的串口。
之后的代码类似如下:
OVERLAPPED overlapped;
if ( !WaitCommEvent( hComm, &dwEvent, &overlapped ) )
{
if ( GetLastError() == ERROR_IO_PENDING )
{
DWORD ret = WaitForSingleObject( overlapped.hEvent, 1000); //这个地方你可以设置超时
if ( ret == TIME_OUT )
{
..超时处理..
}
DWORD dwByte; // 仅用作参数,无意义
ret = GetOverlappedResult( hComm, &overlapped, &dwByte, FALSE )
if ( ret == 0 )
{
..相应的错误处理..
}
}
else
{
..相应的错误处理..
}
}
..这里你就可以读取数据了。
ashamwolf 2005-08-02
  • 打赏
  • 举报
回复
我的程序要处理的是这样的情况:向串口设备发送一个命令,然后读取设备的返回。每个命令对应一个返回,从返回的内容不能区别出是哪条命令的返回,所以用多线程不合适。
healer_kx 2005-08-02
  • 打赏
  • 举报
回复
那你就让他好使,你要多看MSDN。

OpenHero 2005-08-02
  • 打赏
  • 举报
回复
多线程,异步模式~~

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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