C++ 在COM端口上等待数据?
我正在寻找一种方法,使Windows串行端口在收到数据之前超时。如果有某种触发事件或函数来完成我想做的事情,那就太好了 这是我当前的实现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
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更好。