[英]GetQueuedCompletionStatus stops reading a serial port
我有一台通过串行端口生成消息的设备。 重新引导设备时,IO完成端口将停止读取字节。
该代码称为GetQueuedCompletionStatus():
BOOL bRet = GetQueuedCompletionStatus(
m_hCompletionPort,
&dwBytesTransferred,
&dwCompletionKey,
&pOverlapped,
INFINITE);
PortMon看起来像:
...
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()和SetCommTimeouts()。 在传递给SetCommState()的DCB中,需要设置fAbortOnError。 如果确实使错误出队,则需要先调用ClearCommError(),然后再使另一条读入队列。
回复:詹姆(抱歉,我似乎无法在您的回答中添加评论)
我确实尝试设置了各种标志,包括DCB的fAbortOnError,但GetQueuedCompletionStatus()仍将无限期等待。 我还尝试定期使呼叫超时,并检查串行端口是否有错误。 串行端口始终看起来不错,但断开连接仍将永久破坏IO完成端口。 重新启动设备可能会创建一个短暂的错误状态...我说是可能的,因为我从未能够检测到它!
一位开发人员也对此问题有所了解,他们也失败了。 因此,我们只重写了代码以使用重叠的串行端口读取,现在工作正常。
在某些地方,我们可能遗漏了一些东西……最后,我们花费了更多的时间来解决这个谜团,而不是重写代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.