diff --git a/src/serial.cpp b/src/serial.cpp index 0265fb9..6534ad8 100644 --- a/src/serial.cpp +++ b/src/serial.cpp @@ -203,25 +203,32 @@ static const boost::posix_time::time_duration timeout_zero_comparison(boost::pos const int Serial::read(char* buffer, int size) { this->reading = true; if(this->nonblocking) {// Do not wait for data - return this->serial_port->read_some(boost::asio::buffer(buffer, size)); + this->serial_port->async_read_some(boost::asio::buffer(buffer, size), + boost::bind(&Serial::read_complete, this, + boost::asio::placeholders::error, + boost::asio::placeholders::bytes_transferred)); } else { // Wait for data until size is read or timeout occurs boost::asio::async_read(*this->serial_port, boost::asio::buffer(buffer, size), transfer_at_least_ignore_invalid_argument(size), boost::bind(&Serial::read_complete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); - if(this->timeout > timeout_zero_comparison) { // Only set a timeout_timer if there is a valid timeout - this->timeout_timer.expires_from_now(this->timeout); - this->timeout_timer.async_wait(boost::bind(&Serial::timeout_callback, this, - boost::asio::placeholders::error)); - } - - while(this->reading) - this->io_service.run_one(); - - this->bytes_to_read = size; - - return this->bytes_read; } + if(this->timeout > timeout_zero_comparison) { // Only set a timeout_timer if there is a valid timeout + this->timeout_timer.expires_from_now(this->timeout); + this->timeout_timer.async_wait(boost::bind(&Serial::timeout_callback, this, + boost::asio::placeholders::error)); + } else if(this->nonblocking) { + this->timeout_timer.expires_from_now(boost::posix_time::milliseconds(1)); + this->timeout_timer.async_wait(boost::bind(&Serial::timeout_callback, this, + boost::asio::placeholders::error)); + } + + while(this->reading) + this->io_service.run_one(); + + this->bytes_to_read = size; + + return this->bytes_read; } const std::string Serial::read(int size) {