等待COM端口上的数据
Wait for data on COM port?
我正在寻找一种方法,让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获取一些数据时生成您自己的事件或消息给其他线程。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- C++ 安全数组在从 c# COM dll 返回时具有无效数据
- 如何等待 COM 端口上的数据
- 接收RS232(COM)的数据
- 读取 COM 端口数据C++
- 等待COM端口上的数据
- 复杂C++数据类型和 COM
- 尝试使用 c++ 从 com 端口读取写入数据
- 从 COM 端口 C++ 接收NMEA0183数据
- 使用com端口通过cpp中的串行端口发送数据
- COM互操作传递了错误的指针,我的数据只有一个字节
- 使用c#结构体将数据从c# COM对象传递到c++
- 使用通用的COM dll在线程内共享数据
- 如何将数据从非托管应用程序传递到 C# COM DLL
- 使用 C++ 从 COM 端口读取输出数据
- 是否在释放或析构函数中删除com对象的实例数据?