C++ GetQueuedCompletionStatus停止读取串行端口

C++ GetQueuedCompletionStatus停止读取串行端口,c++,windows,C++,Windows,我有一个通过串行端口生成消息的设备。当我重新启动设备时,IO完成端口停止读取字节 代码是调用GetQueuedCompletionStatus(): 波特蒙看起来像: ... IRP_MJ_WRITE Serial1 SUCCESS LENGTH: 7 REBOOT. IRP_MJ_READ Serial1 CANCELLED LENGTH: 1 日志记录显示以下结果: bRet=true, dwBytesTransferred=7, pOv

我有一个通过串行端口生成消息的设备。当我重新启动设备时,IO完成端口停止读取字节

代码是调用GetQueuedCompletionStatus():

波特蒙看起来像:

...
IRP_MJ_WRITE    Serial1    SUCCESS     LENGTH: 7    REBOOT.
IRP_MJ_READ     Serial1    CANCELLED   LENGTH: 1    
日志记录显示以下结果:

bRet=true, dwBytesTransferred=7, pOverlapped=0x0202B028, GetLastError()=997
(sleep forever)
是否有任何方法可以检测此故障并重新建立通信


我可以监视热节拍并关闭/重新打开串行端口,但windows API允许串行通信以这种方式静默下降似乎不正确。

如果您在打开的串行端口句柄上执行WaitForSingleObject,开始读取数据,当设备重新启动时,手柄是否发出信号?也许这是一种告诉您何时需要再次打开端口的方法?

IO完成端口当然可以毫无问题地处理这种情况。您不需要关闭并重新打开设备

在这种情况下,最有可能的问题是,您的线路上有一个错误(由设备重置引起),您没有使用ClearCommError()清除该错误

您需要为您的设备预先适当地使用SetCommState()和setCommTimeout()。在传递给SetCommState()的DCB中,需要设置FaborToError。如果您确实退出错误队列,则需要调用ClearCommError(),然后才能重新进行读取。

RE:janm(我似乎无法对您的答案添加注释抱歉)

我确实尝试过设置各种标志,包括DCB的FaborToneError,但是GetQueuedCompletionStatus()仍然会无限等待。我还尝试定期对调用进行计时,并检查串行端口是否存在错误。串行端口看起来总是很好,但是断开连接仍然会永久中断IO完成端口。设备重新启动可能会造成暂时错误状态。。。我说可能吧,因为我从来没能发现它

另一位开发人员在这个问题上也遇到了难题,他们也失败了。所以我们只是重写了代码,使用重叠的串行端口读取,现在它可以正常工作了


也许我们错过了什么,什么地方。。。最后,我们试图解开谜团的时间比重写代码的时间要多。

谢谢。我试图在不考虑IO完成端口使用的情况下处理这个问题,但看起来我没有太多选择。你可以选择:看看我的答案!有趣。我已经开发了许多系统,在使用IOCompletionPorts时可以做到这一点;我的设计倾向于使用大量的单字节读取。这些用于控制系统,在测试过程中,串行端口受到各种滥用。另一种可能是串行设备驱动程序中存在错误。如果您使用的是第三方串行板,而不是带有标准串行端口的Windows本机驱动程序,则更可能出现这种情况。
bRet=true, dwBytesTransferred=7, pOverlapped=0x0202B028, GetLastError()=997
(sleep forever)