c++ - 在 C++ 中的 Windows 串行端口上设置 low_latency 标志

标签 c++ windows serial-port

我有一个使用 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/

相关文章:

c++ - 如何使用 C++ 正确检查注册表项是否存在?

c++ - 具有重载 r 值引用函数的模糊调用

c++ - C++中的数据包序列化

windows - 在 Windows 上对 HTTPS URL 运行 wget 时如何修复证书错误?

windows - Elasticsearch - 在 Windows 中使用 Sense Web 插件批量插入

c++ - Win32 API : how to read the serial, 或如果不是数据则在超时内退出

timer - stm32动态定时器设置改变

Python导入错误: No module named sty

c++ - 多个提升 io_service 用于单独线程上的多个网卡

windows - 崩溃显示Visual Studio选项。但不显示不发送消息