等待COM端口上的数据

Wait for data on COM port?

本文关键字:数据 COM 等待      更新时间:2023-10-16

我正在寻找一种方法,让Windows串行端口超时,直到它接收到数据。如果有某种事件触发或函数做我想做的事情,那就太好了。

这是我目前的实现方式。

void waitforCom(unsinged char byte)
{
   while (true)
   {
      ClearCommError(serial_handle, &errors, &status);
      if (status.cbInQue>0)
      {
         //check if correct byte
         break;
      }
   }
}

您可以使用的另一个API调用是WaitCommEvent()

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363479(v=vs.85).aspx

此调用可以异步工作,因为它将OVERLAPPED对象作为参数。在您的情况下,您只想等待EV_RXCHAR事件,让您知道数据已经到达:

OVERLAPPED o = {0};
o.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
SetCommMask(comPortHandle, EV_RXCHAR);
if (!WaitCommEvent(comPortHandle, &commEvent, &o))
{
    // Check GetLastError for ERROR_IO_PENDING, if I/O is pending then
    // use WaitForSingleObject() to determine when `o` is signaled, then check
    // the result. If a character arrived then perform your ReadFile.
}

或者,您可以通过使用一个具有未完成的ReadFile调用的线程来做同样的事情,但使用OVERLAPPED对象,而不是按照MSchanges的建议进行阻塞。

说到WinApi,我并不是一个真正的专家,但有一整篇关于微软开发者网络的文章,涵盖了串行通信的主题。本文提到了等待来自端口的数据的主题,并提供了一个示例。

在winAPI级别,对于大多数应用程序,您需要将线程专用于串行端口输入,因为ReadFile是一个阻塞调用(但会超时)。您能得到的最有用的事件是ReadFile返回。只需将ReadFile放入线程中的循环中,并在ReadFile获取一些数据时生成您自己的事件或消息给其他线程。