mirror of
https://github.com/wjwwood/serial.git
synced 2026-01-23 04:04:54 +08:00
Fix issue with write() and a timeout of 0.
This commit is contained in:
parent
2d416f1560
commit
64395f314f
@ -450,6 +450,8 @@ public:
|
|||||||
* reading or writing is complete, when a timeout occurs, or when an
|
* reading or writing is complete, when a timeout occurs, or when an
|
||||||
* exception occurs.
|
* exception occurs.
|
||||||
*
|
*
|
||||||
|
* A timeout of 0 enables non-blocking mode.
|
||||||
|
*
|
||||||
* \param timeout A serial::Timeout struct containing the inter byte
|
* \param timeout A serial::Timeout struct containing the inter byte
|
||||||
* timeout, and the read and write timeout constants and multipliers.
|
* timeout, and the read and write timeout constants and multipliers.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -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);
|
total_timeout_ms += timeout_.write_timeout_multiplier * static_cast<long> (length);
|
||||||
MillisecondTimer total_timeout(total_timeout_ms);
|
MillisecondTimer total_timeout(total_timeout_ms);
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
while (bytes_written < length) {
|
while (bytes_written < length) {
|
||||||
int64_t timeout_remaining_ms = total_timeout.remaining();
|
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
|
// Timed out
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if( first ) {
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
timespec timeout(timespec_from_ms(timeout_remaining_ms));
|
timespec timeout(timespec_from_ms(timeout_remaining_ms));
|
||||||
|
|
||||||
FD_ZERO (&writefds);
|
FD_ZERO (&writefds);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user