2010-12-16 60 views
7

我有一个boost :: asio和boost :: asio :: serial_port设备的特殊问题。这段代码最终在异步读取和东西上运行得非常好,但我无法弄清楚如何即时更改串口的速度。如何使用boost :: asio(或者如何确定硬件缓冲区是否为空)更改串口速度?

我现在想要做的只是告诉我的串行端口连接的设备改变串口速度说38400波特,然后我通过设置我的电脑串口到相同的速度:

port_.set_option(boost::asio::serial_port_base::baud_rate(rate));

但真正的情况是,如果我做的set_option一部分,设备永远不会接收命令来改变速度。如果我不执行set_option部分,则设备正确更改速度。从我收集的情况来看,(阻塞,同步)写入将东西放入计算机的硬件缓冲区中并返回,然后执行放弃缓冲区的set_option(在它有时间将数据发送到设备之前)。所以我需要考虑一些方法来检查硬件缓冲区是否为空,并且在重新配置计算机串行端口之前,设备确实已收到命令以更改速度。如果必须在端口上执行close()和open()以使速度更改生效,我也找不到任何信息。我也想知道close()是否放弃缓冲区中的东西......我使用的是USB->串口适配器,如果它有任何区别,我的平台是Ubuntu 10.10。

回答

-1

您是否尝试冲洗缓冲区或寻找合适的冲洗替代方法?

客户端和服务器是否在同一个进程中?

Boost.Asio iostream flush not working?

+0

那么我基本上有一个boost :: asio:io_service和一个boost :: asio :: serial_port,io_service被初始化,serial_port在构造函数中被io_service初始化,然后serial_port被配置为set_options。我不能说我可以在serial_port或io_service中看到任何flush()方法。我的代码中没有任何一个asio :: iostream。 – Dago 2010-12-17 07:43:18

+0

当我想连接到以不同速度运行的不同设备时,我总是关闭串口。这是一个有趣的问题 - 抱歉,我无法提供更多帮助。 – Kieveli 2010-12-17 14:38:40

+0

-1 OP不使用Asio流 – 2010-12-23 16:22:45

3

你有lookedman 3 termios?这似乎tcdrain做什么,你需要

tcdrain()等待,直到写入由 fd引用的对象的所有输出 已发送。

您可以从boost::asio::serial_port::native获得本地描述符。

相关问题