首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中的windows串行端口上设置low_latency标志

在c++中的windows串行端口上设置low_latency标志
EN

Stack Overflow用户
提问于 2012-05-23 19:06:43
回答 2查看 2.5K关注 0票数 3

我有一个使用boost asio打开串行端口的程序。

默认情况下,串行端口具有使线路保持空闲的延迟。在windows平台上,我看到的延迟是30ms,而在Linux平台上,延迟是20ms。

对于Linux环境,我发现"linux.h“的类'ioctl‘有一种使用一些标志设置串行设置的方法(以及我所需要的: low_latency)。

代码如下:

代码语言:javascript
复制
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设备管理器中更改串行端口的属性,但我没有这些解决方案所显示的那些属性,我需要一个代码解决方案。

EN

回答 2

Stack Overflow用户

发布于 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查询当前值

票数 2
EN

Stack Overflow用户

发布于 2012-08-17 07:23:21

我记得在NT4/Win2k/WinXP时代有过这个问题,我想你也有类似的问题。

使用COMMTIMEOUT结构总是会在每次超时后添加一个时间片延迟,这意味着对于可变长度的数据包,您总是会添加10ms或16ms的延迟,这取决于机器是否为SMP机器。例如,您不能真正获得1ms的超时。即使在具有完成端口的串行端口上的异步操作上使用COMMTIMEOUT,也是如此。

这提供了非常高的性能,但代价是一些代码复杂性。

您可以尝试为Windows for asio实施基于Windows IOCP的串行端口后端,也可以为串行通信使用单独的IOCP和线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10718693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档