C++ 在COM端口上等待数据?

C++ 在COM端口上等待数据?,c++,windows,serial-port,C++,Windows,Serial Port,我正在寻找一种方法,使Windows串行端口在收到数据之前超时。如果有某种触发事件或函数来完成我想做的事情,那就太好了 这是我当前的实现 void waitforCom(unsinged char byte) { while (true) { ClearCommError(serial_handle, &errors, &status); if (status.cbInQue>0) { //check if

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

这是我当前的实现

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

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

对于WinApi,我并不是一个真正的专家,但有一整篇关于的文章,涵盖了串行通信的主题。本文提到了等待端口数据的主题,并提供了一个示例。

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

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

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

此调用可以异步工作,因为它将
重叠的
对象作为参数。在您的情况下,您只需等待
EV\u 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
调用的线程来执行相同的操作,但使用
重叠的
对象,而不是像MSalters建议的那样进行阻塞。

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

此调用可以异步工作,因为它将
重叠的
对象作为参数。在您的情况下,您只需等待
EV\u 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建议的阻塞。

使用线程和阻塞相当粗糙。异步I/O要好得多。使用线程和阻塞相当粗糙。异步I/O更好。