有没有一个非阻塞函数返回当前串行端口在Windows中的队列长度,使用C?
我所看到的所有示例只是简单地调用ReadFile
,直到指定的超时时间,所以我想知道是否有可能在读取之前检查缓冲区中是否有任何东西?
例如,我可以简单地为每个字符做这个:
void ReadCharacter(char *theCharacter) { DWORD numBytesRead = 0; while (numBytesRead == 0) { ReadFile(comPorthandle, theCharacter, sizeof(char), &numBytesRead, NULL); } }
但有没有可能有类似的东西
int numBytesRx = GetNumBytesRx(&portHandle); if (numBytesRx > 0) Read(&portHandle, targetBuffer, numBytesRead);
通过ReadFile
使用COM端口执行异步IO考虑使用函数的最后一个参数, LPOVERLAPPED
和OVERLAPPED
结构。 OVERLAPPED
是Windows中异步IO的常见做法。
在这里你可以找到例子
ReadFile
将始终返回rx缓冲区中已有的内容。 所以如果你不设置超时,你会立即得到内容。
虽然请注意,没有专业的应用程序把ReadFile
放在忙等待循环中。 这不仅会不必要地占用CPU,还会阻塞循环所在的线程。
所以你应该把ReadFile
放在它自己的线程里面。 所有I / O功能都是常见的做法。 这将解决阻塞问题,但您仍然有高CPU使用的问题。
作为替代方案,您可以使用ReadFileEx
函数使用Windows调用“异步I / O”(*)的方法。 它可以让你指定一个回调函数,当你实际接收到一些数据的时候会被触发。
现在,如果将“异步I / O”与线程结合使用,则可以实现无阻塞的通信,在没有要处理的数据时不会消耗CPU。 你的I / O线程可以用SleepEx
等待I / O,也可以等待从回调中手动设置的事件。
(*)“异步I / O”是无意义的Windows术语,因为从技术上讲,所有的串行端口通信总是异步的。 你是否会同步发送数据,而没有任何停顿,只能让一台缓慢的台式电脑跟不上。