提升streambuf并编写奇怪的行为

时间:2016-05-27 16:25:18

标签: c++ boost boost-asio

我使用streambuf作为串口通信的存储

io_service io;
serial_port sp(io);
sp.open("COM4");
sp.set_option( serial_port_base::baud_rate( 115200 ) );
sp.set_option( serial_port_base::character_size( 8 ) );
sp.set_option( serial_port_base::stop_bits( serial_port_base::stop_bits::one )  );
sp.set_option( serial_port_base::parity( serial_port_base::parity::none ) );
sp.set_option( serial_port_base::flow_control( serial_port_base::flow_control::none )   );
boost::asio::streambuf buffer;
// Fill buffer here
auto size = buffer.size();
std::cout << boost::format("Buffer size: %d") % size << std::endl;
boost::asio::write( sp, buffer );
size = buffer.size();
std::cout << boost::format("Buffer size: %d" ) % size << std::endl;

输出:

Buffer size: 8
Buffer size: 0

为什么方法size()会返回不同的值?

1 个答案:

答案 0 :(得分:4)

boost::asio::write()操作消耗streambuf的输入序列,streambuf::size()返回输入序列的大小。

在这种特殊情况下,streambuf的输入序列在write()操作之前包含8个字节。 write()操作将一直阻塞,直到输入序列中的所有数据都被写入或发生错误为止。 write()操作成功,consuming来自输入序列的8个字节,并返回一个值以指示已传输了8个字节。由于已消耗了所有输入序列,streambuf.size()将返回0.

有关streambuf使用的更多信息,请考虑阅读this answer。