3
votes

I'm writing a C++ program for communicating with a Arduino over a serial port using boost::asio. After establishing the connection the Arduino resets itself. However the input buffer of the C++ program still contains old data sent from the Arduino. Since I have no use for this data I'd like clear the input buffer. How can I accomplish that using boost::asio?

My code currently looks like this:

#include <boost/asio.hpp>
#include <vector>
#include <iostream>

using namespace std;
using namespace boost::asio;

int main()
{
    io_service io_service;
    serial_port port(io_service, "/dev/ttyACM0");
    port.set_option(serial_port_base::baud_rate(9600));
    vector<char> buf(1);
    read(port, buffer(buf));
    cout << (int) buf[0] << endl;
    return 0;
}

The code should pause at the read command and wait for the arduino to send serial data. However there is old data causing the code to immediately continue.

1
You can just keep reading until there is nothing left every time you do a reset? - Fantastic Mr Fox
@Ben The Arduino automatically resets when i open the serial port so I don't see a way of reading all the data before resetting. Reading the data after resetting the Arduino however seems risky to me since the Arduino could start sending data while I am still in the process of clearing the buffer. - Manuel
The Arduino automatically resets when i open the serial port, why does it do that? Have you designed it this way? - Fantastic Mr Fox
@Ben It's the default behaviour of the Arduino. - Manuel
That doesnt sound desirable, perhaps you should do this - Fantastic Mr Fox

1 Answers

4
votes

You can flush the serial buffer, which should do what you want (get rid of all pending data up to the time of the flush). Unfortunately, it seems Boost does not have a wrapper for doing this, so you have to grab the native_handle for the serial port. I based the code I'm using off this answer: https://stackoverflow.com/a/22598329/1167230