我使用time
将数据从缓冲区写入com-Port。它是一个波特率为115200的串口,这意味着(根据我的理解)我可以有效地将11520字节/秒或11,52KB / s数据写入套接字。
现在我有一大堆数据(10015字节),我想写。我认为这应该花费不到一秒的时间来真正写入端口。但是boost::asio::write()
在调用传输的字节10015后已经返回300微秒。我认为这不可能用波特率?
所以我的问题是它究竟在做什么?真的把它写到端口,或者只是其他类型的缓冲区,然后将其写入端口。
我希望boost::asio::write()
仅在所有字节真正写入端口后才返回。
使用代码示例进行编辑:
问题是我总是遇到未来/承诺的超时,因为发送消息需要超过100毫秒,但我认为定时器只应在发送最后一个字节后启动。因为write()
应该阻止?
write()
我怎样才能做到这一点? 谢谢!
答案 0 :(得分:4)
简而言之,boost::asio::write()
阻塞,直到所有数据都写入到流中;它直到所有数据都已传输才会阻止。要等到数据传输,请考虑使用tcdrain()
。
每个串行端口在内核空间中都有一个接收和发送缓冲区。这允许内核缓冲接收的数据,如果进程不能立即从串口读取,并允许数据写入到串口如果设备无法立即传输,则进行缓冲。要阻止数据传输,可以使用tcdrain(serial_.native_handle())
。
这些内核缓冲区允许写入和读取速率超过发送和接收速率。但是,虽然应用程序可能以比串行端口可以传输的更快的速率写入数据,但内核将以适当的速率进行传输。