Windows 7,x64,C ++,MSVC 2015社区。 p>
我正在编写一个程序,需要识别第一个带有活动的串口。理想情况下,我不想丢失第一个字节。我可以想到四种方法:
打开所有串口,为每个串口做一个重叠的ReadFile
个字节,然后是一个WaitForMulipleEvents
。当返回时,关闭非活动端口,并将接收到的字节存储在某个位置,并将后续ReadFile
包装在某个已知需要时插入第一个字节的函数中。
优点:异步,没有民意调查,已经大部分实施
缺点:跟踪一个额外的字节并包装ReadFile
很烦人。
基本上是#1,但找到一些方法将字节推回到串行驱动程序缓冲区的前面。我已经在谷歌上搜索了好几天,但没有找到任何东西。似乎不太可能,但是如果有效则会阻止我跟踪额外的字节。
打开所有串口并使用ClearCommError
轮询可用字节
当某些内容有可用字节时,请关闭其他端口。需要在循环中添加延迟,这样就不会使系统陷入困境。我不想看到100%的CPU利用率,除了等待进来之外什么都不做。
优点:保持后续的Readfile
纯,无需包裹它并追踪额外的字节。
缺点:当看起来应该有异步方法时,轮询很糟糕。我必须调整民意调查之间的延迟,以确保当它可能以高达460kbps的速度进入时不会溢出。
找到一种使用重叠DeviceIoControl
调用的方法,然后WaitForMultipleEvents
发出信号,表示字节可用,但我还没找到任何IOCTL...
代码这样做。
我想的越多,#3听起来就像是最好的选择。我不喜欢轮询,但它避免了跟踪额外的字节。
有一种干净的异步方式来做我需要的吗? I / O完成端口可以发挥作用吗?
感谢