我在Windows上使用I / O完成端口进行串口通信(我们可能会有很多串口使用)。我已经完成了常规操作,创建了IOCP,启动了I / O线程,并将我的CreateFile()
句柄与IOCP相关联(CreateFile()
使用FILE_FLAG_OVERLAPPED
调用)。这一切都很好。我已将COMMTIMEOUTS
全部设置为0,但ReadIntervalTimeout
除外MAXDWORD
,以便完全异步。
在我的I / O线程中,我注意到GetQueuedCompletionStatus()
无限期阻塞。我正在使用INFINITE
超时。因此,在将句柄与IOCP关联后,我立即进行了ReadFile()
调用。现在导致GetQueuedCompletionStatus()
由于某种原因立即释放,传输了0个字节,但没有错误(它返回true,GetLastError()报告0)。如果没有什么可以做的话,我显然希望它能阻止它。如果我在GetQueuedCompletionStatus()之后放了另一个ReadFile()
,那么池中的另一个线程将接收它,传输0个字节并且没有错误。
在我见过并遵循的示例中,我没有看到有人在使用IOCP时在hEvent
结构上设置OVERLAPPED
。这有必要吗?我不关心阻止IOCP线程 - 所以我永远不会对CreateEvent(...) | 1
感兴趣。
如果没有必要,可能导致问题的原因是什么? GetQueuedCompletionStatus()
需要阻塞,直到数据到达串口。
那里有没有好的IOCP串口示例?我还没有找到完整的串口+ IOCP示例。他们大多数是插座。从理论上讲,它应该适用于串行端口,文件,套接字等。
答案 0 :(得分:0)
我弄清楚了 - 我没有使用SetCommMask()
调用EV_RXCHAR | EV_TXEMPTY
,然后使用WaitCommEvent()
结构调用OVERLAPPED
。在我这样做之后,我的IOCP线程表现得如预期的那样。当端口上出现新角色时,GetQueuedCompletionStatus()
返回。然后我可以拨打ReadFile()
。
所以回答原来的问题:“不,你不需要为串行端口的IOCP设置hEvent。”