C++ 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. //

我正在使用非重叠WaitCommEvent读取文件数据。 我想提供一段代码如下

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通用解决方案是什么呢?请看这篇文章,这应该会有帮助: