2016-05-27 6 views
1

Ich verwende streambuf als Speicher für Kommunikation über serielle SchnittstelleBoost-streambuf und schreiben seltsames Verhalten

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; 

Ausgang:

Buffer size: 8 
Buffer size: 0 

Warum Methode size() unterschiedliche Werte zurückgeben?

+1

Können Sie näher erläutern, warum, nachdem Sie den Puffer ausgeschrieben haben, Sie erwarten, dass er eine von Null verschiedene Größe hat? –

+0

@MarkB Ich erwarte, dass der Schreibvorgang am seriellen Port oder Socket meinen Speicherpuffer nicht ändert. Normalerweise ändern keine Schreibmethoden die Quelle. Vielleicht interpretiere ich sreambuf falsch? – Jeka

Antwort

4

Der Vorgang boost::asio::write() verbraucht die Eingangsfolge streambuf, und streambuf::size() gibt die Größe der Eingangssequenz zurück.

In diesem speziellen Fall enthielt die Eingangsfolge streambuf 8 Bytes vor der Operation write(). Der write()-Betrieb blockiert, bis alle Daten aus der Eingangsfolge geschrieben wurden oder bis ein Fehler auftritt. Die Operation write() ist erfolgreich, consuming 8 Byte von der Eingabesequenz und gibt einen Wert zurück, der angibt, dass 8 Byte übertragen wurden. Da die gesamte Eingangssequenz verbraucht wurde, gibt streambuf.size() den Wert 0 zurück.

Weitere Informationen zur Verwendung von streambuf finden Sie in der Antwort this.