1

我有一个在串行端口上执行重叠 I/O 的程序,我看到应用程序未读取已接收数据的情况。我的代码正在使用SetCommMask()WaitCommEvent()如下所示:

if(!waiting_for_comm_event)
{
   comm_event_ready = false;
   if(!SetCommMask(port_handle, EV_RXCHAR | EV_ERR | EV_RLSD))
      throw OsException(my_strings[strid_set_comm_mask_failed].c_str());
   rcd = WaitCommEvent(port_handle, &event_mask, &event_control);
   last_error = GetLastError();
   if(rcd && event_mask != 0)
       comm_event_ready = true;
   else if(last_error != ERROR_IO_PENDING)
       throw OsException(my_strings[strid_wait_comm_event_failed].c_str());
   else
       waiting_for_comm_event = true;
  }

在我的输出缓冲区中写入任何数据后调用此代码。在写入过程中可能会接收到数据。是否会WaitCommEvent()报告已经有数据等待读取的情况?

4

1 回答 1

3

如果你必须在这里问,你不想知道答案。

不,真的——这意味着您依赖于未记录的行为,这些行为可能会在未来的 Windows 版本中发生变化。

您可以改为使用重叠 I/O 来开始跟踪传入数据和事件,然后再发送触发它们的数据。

两种方法(我ReadFileEx在自己的串行代码中使用第一种的变体):

  • 发出背景(重叠)读取。
  • 发出背景(重叠)WaitCommEvent
  • 写入数据。
  • 等待两个后台操作...完成任何一个都将导致WaitForMultipleEvents继续。

或者

  • 发出背景(重叠)WaitCommEvent
  • 写入数据。
  • 等待后台操作。
  • 如果唤醒事件是接收数据,则读取它。

WriteFile在任何一种情况下,都会检测到传入数据和错误,甚至在完成之前。

于 2012-11-08T20:50:15.373 回答