mirror of
https://github.com/wjwwood/serial.git
synced 2026-01-22 11:44:53 +08:00
More fixes related to non-blocking read.
This commit is contained in:
parent
1b2d29f6a7
commit
5ef78ddefd
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user