等待COM端口上的数据?

时间:2013-11-25 01:37:16

标签: c++ windows serial-port

我正在寻找一种让Windows串口超时直到收到数据的方法。如果某种事件触发或功能完全符合我的要求,那就太好了。

这是我目前的实施。

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

3 个答案:

答案 0 :(得分:3)

您可以使用的另一个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对象而不是像MSalters建议的那样阻塞。

答案 1 :(得分:1)

关于WinApi,我不是真正的专家,但Microsoft Developer Network上有一篇关于串行通信主题的文章。文章提到了从端口等待数据的主题,并提供了一个示例。

答案 2 :(得分:0)

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