Reading from serial port with Boost Asio
This article is helpful in understanding how ASIO can be used asynchronously with serial ports:
- https://gist.github.com/kaliatech/427d57cb1a8e9a8815894413be337cf9
UPDATE (2019-03):
The original article I had linked to is no longer available and is difficult to find even in Internet Archive. (Here is a snapshot.). There are now newer articles on using ASIO for serial I/O found easily by searching, but this older article is still very useful. I'm putting it in a public gist so that it doesn't get lost:
- https://gist.github.com/kaliatech/427d57cb1a8e9a8815894413be337cf9
The code described in the article appears to have been copied here:
- https://github.com/fedetft/serial-port
The author seems to have updated it for C++11. I believe the article was originally written by fede.tft.
Jason,
If it is suitable for your application, I'd highly recommend implementing a callback-based asynchronous serial RX. How do I perform a nonblocking read using asio? has a great little example of how to implement asynch serial with a timeout. As you recognised, it will require a multi-threaded implementation to get the performance advantages, so you will need to put some thought where your recieved data will be buffered to make sure you aren't doing a lot of copying.
As far as the boost::streambuff
stuff goes, I personally prefer just to block out some memory as a char array - char m_RXBuffer[m_RXBuffSize]
and use boost::asio::buffer(m_RXBuffer, m_RXBuffSize)
to pass the target buffer into async_read_some
. In particular for RS232, I have always found the fact that the underlying data is a stream of bytes naturally maps a lot better onto a simple char array than any of the more complex data structures.
Good Luck!