Skip to content

Commit dc03293

Browse files
authored
(re)introduce timeout in HardwareSerial::readBytes(buffer, size) (esp8266#5558)
(re)introduce timeout in HardwareSerial::readBytes(buffer, size), add HardwareSerial::read(buffer, size) + visual test
1 parent 8f8628c commit dc03293

File tree

4 files changed

+55
-7
lines changed

4 files changed

+55
-7
lines changed

cores/esp8266/HardwareSerial.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <stdio.h>
2828
#include <string.h>
2929
#include <inttypes.h>
30+
#include <PolledTimeout.h>
3031
#include "Arduino.h"
3132
#include "HardwareSerial.h"
3233
#include "Esp.h"
@@ -132,6 +133,22 @@ unsigned long HardwareSerial::detectBaudrate(time_t timeoutMillis)
132133
return detectedBaudrate;
133134
}
134135

136+
size_t HardwareSerial::readBytes(char* buffer, size_t size)
137+
{
138+
size_t got = 0;
139+
140+
while (got < size)
141+
{
142+
esp8266::polledTimeout::oneShot timeOut(_timeout);
143+
size_t avail;
144+
while ((avail = available()) == 0 && !timeOut);
145+
if (avail == 0)
146+
break;
147+
got += read(buffer + got, std::min(size - got, avail));
148+
}
149+
return got;
150+
}
151+
135152
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
136153
HardwareSerial Serial(UART0);
137154
#endif

cores/esp8266/HardwareSerial.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,15 @@ class HardwareSerial: public Stream
132132
// return -1 when data is unvailable (arduino api)
133133
return uart_read_char(_uart);
134134
}
135-
size_t readBytes(char* buffer, size_t size) override
135+
// ::read(buffer, size): same as readBytes without timeout
136+
size_t read(char* buffer, size_t size)
136137
{
137138
return uart_read(_uart, buffer, size);
138139
}
140+
size_t readBytes(char* buffer, size_t size) override;
139141
size_t readBytes(uint8_t* buffer, size_t size) override
140142
{
141-
return uart_read(_uart, (char*)buffer, size);
143+
return readBytes((char*)buffer, size);
142144
}
143145
int availableForWrite(void)
144146
{

libraries/esp8266/examples/SerialStress/SerialStress.ino

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
#define BUFFER_SIZE 4096 // may be useless to use more than 2*SERIAL_SIZE_RX
1717
#define SERIAL_SIZE_RX 1024 // Serial.setRxBufferSize()
1818

19+
#define FAKE_INCREASED_AVAILABLE 100 // test readBytes's timeout
20+
1921
#define TIMEOUT 5000
2022
#define DEBUG(x...) //x
2123

2224
uint8_t buf [BUFFER_SIZE];
2325
uint8_t temp [BUFFER_SIZE];
2426
bool reading = true;
27+
size_t testReadBytesTimeout = 0;
2528

2629
static size_t out_idx = 0, in_idx = 0;
2730
static size_t local_receive_size = 0;
@@ -83,6 +86,7 @@ void setup() {
8386
size_for_1sec = baud / 10; // 8n1=10baudFor8bits
8487
logger->printf("led changes state every %zd bytes (= 1 second)\n", size_for_1sec);
8588
logger->printf("press 's' to stop reading, not writing (induces overrun)\n");
89+
logger->printf("press 't' to toggle timeout testing on readBytes\n");
8690

8791
// prepare send/compare buffer
8892
for (size_t i = 0; i < sizeof buf; i++) {
@@ -136,7 +140,7 @@ void loop() {
136140

137141
if (reading) {
138142
// receive data
139-
maxlen = Serial.available();
143+
maxlen = Serial.available() + testReadBytesTimeout;
140144
if (maxlen > maxavail) {
141145
maxavail = maxlen;
142146
}
@@ -180,8 +184,16 @@ void loop() {
180184
timeout = (last_ms = now_ms) + TIMEOUT;
181185
}
182186

183-
if (logger->read() == 's') {
184-
logger->println("now stopping reading, keeping writing");
185-
reading = false;
186-
}
187+
if (logger->available())
188+
switch (logger->read()) {
189+
case 's':
190+
logger->println("now stopping reading, keeping writing");
191+
reading = false;
192+
break;
193+
case 't':
194+
testReadBytesTimeout ^= FAKE_INCREASED_AVAILABLE;
195+
logger->printf("testing readBytes timeout: %d\n", !!testReadBytesTimeout);
196+
break;
197+
default:;
198+
}
187199
}

tests/host/common/MockSerial.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
*/
3131

3232
#include <Arduino.h>
33+
#include <PolledTimeout.h>
3334

3435
#include <unistd.h> // write
3536

@@ -64,6 +65,22 @@ void HardwareSerial::flush ()
6465
fflush(stdout);
6566
}
6667

68+
size_t HardwareSerial::readBytes(char* buffer, size_t size)
69+
{
70+
size_t got = 0;
71+
72+
while (got < size)
73+
{
74+
esp8266::polledTimeout::oneShot timeOut(_timeout);
75+
size_t avail;
76+
while ((avail = available()) == 0 && !timeOut);
77+
if (avail == 0)
78+
break;
79+
got += read(buffer + got, std::min(size - got, avail));
80+
}
81+
return got;
82+
}
83+
6784
// uart.c
6885

6986
extern "C"

0 commit comments

Comments
 (0)