C++ WaitCommEvent挂起
我正在使用非重叠WaitCommEvent读取文件数据。 我想提供一段代码如下C++ WaitCommEvent挂起,c++,winapi,C++,Winapi,我正在使用非重叠WaitCommEvent读取文件数据。 我想提供一段代码如下 SetCommMask (io_ptr->comPortHandles->hComPort, EV_RXCHAR|EV_TXEMPTY); WaitCommEvent (io_ptr->comPortHandles->hComPort, &dwMask, 0); if (dwMask &= EV_RXCHAR) { // Loop getting data. //
SetCommMask (io_ptr->comPortHandles->hComPort, EV_RXCHAR|EV_TXEMPTY);
WaitCommEvent (io_ptr->comPortHandles->hComPort, &dwMask, 0);
if (dwMask &= EV_RXCHAR) {
// Loop getting data.
// Need to loop because our buffer is only 1024 bytes
while (TRUE)
{
ClearCommError( io_ptr->comPortHandles->hComPort, &dwError, &comstat);
if (!comstat.cbInQue) continue;
else
{
if(comstat.cbInQue > 0)
ReceiveInterrupt(io_ptr, comstat);
}
// Loop around and check for more data
// In case additional byte has arrived while reading.
}
}
如果文件句柄未使用重叠标志打开,则WaitCommEvent将被阻止。在您的情况下,它将等待收到字符或发送最后一个字符 MSDN关于WaitCommEvent: 如果在打开hFile时文件_FLAG_重叠,则WaitCommEvent不会返回,直到指定的事件之一或发生错误
中断在哪里
?没有中断或退出条件。你是说如果(!comstat.cbInQue)中断,代码>?您好,中断或继续不要紧,真正的问题是为什么waitcommevent即使在没有数据可读取的情况下也会阻止读取线程?请格式化您的代码段。我想更清楚地解释如下。。。我正在使用非重叠模式下的WaitCommEvent,尝试读取输入队列中存在的字符。这里的问题是,当队列中没有字符时,WaitCommEvent也不会中断。我尝试了几乎所有可能的条件,但如果队列中没有字符,仍然不希望正确结束waitcommevent,因为我们知道这是一个IOCTL,结束循环的更改较少(我尝试了CancelIOSync函数,但没有得到任何运气)。如果可能的话,请调查该问题?谢谢。你是对的,但问题是我们需要同时支持WindowsCE和Windows7操作系统,因此对于这两种情况,我们都不能使用FILE\u FLAG\u OVERLAPPED。还有什么需要克服的吗?谢谢。我在探索中发现了以下三件事。1.我们无法中断WaitCommEvent循环,因为它是一个IOCTL。2.我们不能使用CancelIOSync,因为它仅受Windows支持。3.我们不能使用重叠结构,因为它仅受Windows CE支持。那么,使用WaitCommEvent的CE和Windows通用解决方案是什么呢?请看这篇文章,这应该会有帮助: