c++ - 如何使用 boost::asio 即时更改串行端口速度(或如何确定硬件缓冲区是否为空)?

标签 c++ serial-port boost-asio

我在使用 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,如果有什么不同的话。

最佳答案

有没有lookedman 3 termiostcdrain 似乎可以满足您的需求

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/

相关文章:

c++ - 信号中的 Qt 枚举需要 qRegisterMetaType

c++ - 在 Crypto++ 中获取 Unicode 字符串的 SHA1

linux - Linux 的虚拟串行端口

batch-file - PuTTY 命令行自动执行来自文件的串行命令

c++ - 使用临时对象是否有性能优势?

c++ - boost asio : maintaining a list of connected clients

c++ - 为什么替换 malloc() 需要链接器的知识,而::operator new() 不需要?

c++ - 使用公钥 X509 V3 (PKCS7) 使用 AES 128 模式 cbc 加密文件

java - 从 Java 字节中提取半字节

c++ - 有没有一种优雅的方式来桥接 Asio 中的两个设备/流?