什么意味着阻止boost :: asio :: write?

时间:2015-05-06 13:35:39

标签: c++ boost boost-asio

我使用time将数据从缓冲区写入com-Port。它是一个波特率为115200的串口,这意味着(根据我的理解)我可以有效地将11520字节/秒或11,52KB / s数据写入套接字。

现在我有一大堆数据(10015字节),我想写。我认为这应该花费不到一秒的时间来真正写入端口。但是boost::asio::write()在调用传输的字节10015后已经返回300微秒。我认为这不可能用波特率?

所以我的问题是它究竟在做什么?真的把它写到端口,或者只是其他类型的缓冲区,然后将其写入端口。

我希望boost::asio::write()仅在所有字节真正写入端口后才返回。

使用代码示例进行编辑:

问题是我总是遇到未来/承诺的超时,因为发送消息需要超过100毫秒,但我认为定时器只应在发送最后一个字节后启动。因为write()应该阻止?

write()

我怎样才能做到这一点? 谢谢!

1 个答案:

答案 0 :(得分:4)

简而言之,boost::asio::write()阻塞,直到所有数据都写入到流中;它直到所有数据都已传输才会阻止。要等到数据传输,请考虑使用tcdrain()

每个串行端口在内核空间中都有一个接收和发送缓冲区。这允许内核缓冲接收的数据,如果进程不能立即从串口读取,并允许数据写入到串口如果设备无法立即传输,则进行缓冲。要阻止数据传输,可以使用tcdrain(serial_.native_handle())

这些内核缓冲区允许写入和读取速率超过发送和接收速率。但是,虽然应用程序可能以比串行端口可以传输的更快的速率写入数据,但内核将以适当的速率进行传输。