2016-05-27 8 views
1

私はシリアルポートの通信ブーストストリームバッファと書き込みには、奇妙な行動

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; 

出力用のストレージとしてstreambufを使用していますか?

+1

バッファを書き出した後に、ゼロ以外のサイズがあると思われる理由を詳しく説明できますか? –

+0

@マークB私は、シリアルポートまたはソケットの書き込み操作でストレージバッファが変更されないと予想しています。通常、書き込みメソッドはソースを変更しません。多分私はsreambufが間違っていると解釈しているのでしょうか? – Jeka

答えて

4

boost::asio::write()の操作は、streambufの入力シーケンスから消費され、streambuf::size()は、入力シーケンスのサイズを返します。

この場合、streambufの入力シーケンスは、write()操作の前に8バイトを含んでいました。 write()は、入力シーケンスのすべてのデータが書き込まれるか、エラーが発生するまでブロックされます。 write()操作は成功し、入力シーケンスから8バイトのconsumingが成功し、8バイトが転送されたことを示す値が戻されます。すべての入力シーケンスが消費されたので、streambuf.size()は0を返します。

ストリームバスの使用の詳細については、thisの回答をお読みください。