1
0
mirror of https://github.com/wjwwood/serial.git synced 2026-01-22 19:54:57 +08:00

Fix issue with write() and a timeout of 0.

This commit is contained in:
Rob Doolittle 2016-09-21 22:37:22 -07:00
parent 2d416f1560
commit 64395f314f
2 changed files with 9 additions and 1 deletions

View File

@ -450,6 +450,8 @@ public:
* reading or writing is complete, when a timeout occurs, or when an
* exception occurs.
*
* A timeout of 0 enables non-blocking mode.
*
* \param timeout A serial::Timeout struct containing the inter byte
* timeout, and the read and write timeout constants and multipliers.
*

View File

@ -617,12 +617,18 @@ Serial::SerialImpl::write (const uint8_t *data, size_t length)
total_timeout_ms += timeout_.write_timeout_multiplier * static_cast<long> (length);
MillisecondTimer total_timeout(total_timeout_ms);
bool first = true;
while (bytes_written < length) {
int64_t timeout_remaining_ms = total_timeout.remaining();
if (timeout_remaining_ms <= 0) {
// Only consider the timeout if it's not the first iteration of the loop
// otherwise a timeout of 0 won't be allowed through
if (!first && (timeout_remaining_ms <= 0)) {
// Timed out
break;
}
if( first ) {
first = false;
}
timespec timeout(timespec_from_ms(timeout_remaining_ms));
FD_ZERO (&writefds);