我正在寻找一种让Windows串口超时直到收到数据的方法。如果某种事件触发或功能完全符合我的要求,那就太好了。
这是我目前的实施。
void waitforCom(unsinged char byte)
{
while (true)
{
ClearCommError(serial_handle, &errors, &status);
if (status.cbInQue>0)
{
//check if correct byte
break;
}
}
}
答案 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获取一些数据时,就可以生成自己的事件或消息给其他线程。