我有一个使用 boost asio 打开串口的程序。
默认情况下,串行端口具有使线路保持空闲的延迟。 在 Windows 平台上,我看到了 30 毫秒的延迟,而在 Linux 平台上,延迟是 20 毫秒。
对于 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 设备管理器中更改串行端口的属性,但我没有这些解决方案显示的那些属性,我需要一个代码解决方案。
最佳答案
获取从 Windows 中的 boost asio 获取的 native 句柄并将其传递给 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
读取间隔超时 通信线路上两个字节到达之间允许经过的最长时间,以毫秒为单位。在 ReadFile 操作期间,时间段从接收到第一个字节开始。如果任何两个字节到达之间的间隔超过此数量,则 ReadFile 操作完成并返回任何缓冲数据。零值表示不使用间隔超时。 MAXDWORD 的值与 ReadTotalTimeoutConstant 和 ReadTotalTimeoutMultiplier 成员的零值相结合,指定读取操作将立即返回已接收到的字节,即使没有接收到字节也是如此。
您还可以使用 GetCommTimeouts 查询当前值:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363261(v=vs.85).aspx
关于c++ - 在 C++ 中的 Windows 串行端口上设置 low_latency 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718693/