我有一个使用boost asio打开串行端口的程序。
默认情况下,串行端口具有使线路保持空闲的延迟。在windows平台上,我看到的延迟是30ms,而在Linux平台上,延迟是20ms。
对于Linux环境,我发现"linux.h“的类'ioctl‘有一种使用一些标志设置串行设置的方法(以及我所需要的: low_latency)。
代码如下:
boost::asio::basic_serial_port<boost::asio::serial_port_service>::native_type native = serial_port_.native(); // serial_port_ is the boost's serial port class.
struct serial_struct serial;
ioctl(native, TIOCGSERIAL, &serial);
serial.flags |= ASYNC_LOW_LATENCY; // (0x2000)
ioctl(native, TIOCSSERIAL, &serial);我也想减少我的windows平台上的延迟。有没有一种等效的方法可以在C++的windows上做同样的事情呢?
顺便说一句,我看到有一些解决方案建议在Windows设备管理器中更改串行端口的属性,但我没有这些解决方案所显示的那些属性,我需要一个代码解决方案。
发布于 2012-08-14 13:58:06
获取在windows中从boost获得的本机句柄,并将其传递给SetCommTimeouts:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437(v=vs.85).aspx
特别是,查看COMMTIMEOUT结构的ReadIntervalTimeout:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363190(v=vs.85).aspx
ReadIntervalTimeout两个字节到达通信线路之间所允许的最长时间,以毫秒为单位。在ReadFile操作期间,该时间段从接收到第一个字节开始。如果任意两个字节到达之间的间隔超过此值,则完成ReadFile操作,并返回所有缓冲数据。零值表示不使用时间间隔超时。MAXDWORD值与ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier成员的零值相结合,指定读取操作将立即返回已收到的字节,即使没有收到字节也是如此。
您还可以使用GetCommTimeouts:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363261(v=vs.85).aspx查询当前值
发布于 2012-08-17 07:23:21
我记得在NT4/Win2k/WinXP时代有过这个问题,我想你也有类似的问题。
使用COMMTIMEOUT结构总是会在每次超时后添加一个时间片延迟,这意味着对于可变长度的数据包,您总是会添加10ms或16ms的延迟,这取决于机器是否为SMP机器。例如,您不能真正获得1ms的超时。即使在具有完成端口的串行端口上的异步操作上使用COMMTIMEOUT,也是如此。
这提供了非常高的性能,但代价是一些代码复杂性。
您可以尝试为Windows for asio实施基于Windows IOCP的串行端口后端,也可以为串行通信使用单独的IOCP和线程。
https://stackoverflow.com/questions/10718693
复制相似问题