我在使用 boost::asio 和 boost::asio::serial_port 设备时遇到了一个特殊问题。代码终于可以很好地处理异步读取和其他内容,但我不知道如何即时更改串行端口的速度。
我现在想做的只是告诉连接到我的串行端口的设备将串行端口速度更改为 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,如果有什么不同的话。
最佳答案
有没有looked在 man 3 termios
? tcdrain
似乎可以满足您的需求
tcdrain() waits until all output written to the object referred to by fd has been transmitted.
您可以从 boost::asio::serial_port::native
获取 native 描述符 method .
关于c++ - 如何使用 boost::asio 即时更改串行端口速度(或如何确定硬件缓冲区是否为空)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461660/