views:

373

answers:

3

Hi! I'm going to check for incoming messages (data packages) on the serial port, using Boost Asio. Each message will start with a header that is one byte long, and will specify which type of the message has been sent. Each different type of message has an own length. The function I'm about to write should check for new incoming messages continually, and when it finds one it should read it, and then some other function should parse it. I thought that the code might look something like this:

void check_for_incoming_messages()
{
    boost::asio::streambuf response;
    boost::system::error_code error;
    std::string s1, s2;
    if (boost::asio::read(port, response, boost::asio::transfer_at_least(0), error)) {
        s1 = streambuf_to_string(response);
        int msg_code = s1[0];
        if (msg_code < 0 || msg_code >= NUM_MESSAGES) {
            // Handle error, invalid message header
        }
        if (boost::asio::read(port, response, boost::asio::transfer_at_least(message_lengths[msg_code]-s1.length()), error)) {
            s2 = streambuf_to_string(response);
            // Handle the content of s1 and s2
        }
        else if (error != boost::asio::error::eof) {
            throw boost::system::system_error(error);
        }
    }
    else if (error != boost::asio::error::eof) {
        throw boost::system::system_error(error);
    }
}

Is boost::asio::streambuf is the right thing to use? And how do I extract the data from it so I can parse the message? I also want to know if I need to have a separate thread which only calls this function, so that it get called more often? Isn't there a risk for loosing data in between two calls to the function otherwise, because so much data comes in that it can't be stored in the serial ports memory? I'm using Qt as a widget toolkit and I don't really know how long time it needs to process all it's events.

Edit: The interesting question is, how can I check if there is any incoming data at all to the serial port? If there is no incoming data, I don't want the function to lock...

A: 

How can I check if there is any incomming data at all to the serial port? If there is no incomming data, I don't want the function to lock...

TriKri
A: 

I've found this article to be really helpful in better understanding how ASIO can be used asynchronously with serial ports: http://www.webalice.it/fede.tft/serial_port/serial_port.html

kaliatech
Thank you! :) That was what I found I had to do too.
TriKri
A: 

I found out that I had to use asynchronous read to read without disrupting the program flow. Before I used the read function, while async_read was the right function to use. The same goes for writing, async_write should be used to prevent the program from locking if the read by some reason makes a pause.

TriKri