From d5ab80c69a75ba4244d93e4146fbdd8f1e6a948d Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 19 Dec 2019 13:31:19 +0100 Subject: [PATCH 1/3] API compatibility to AVR, ESP8266, et al --- cores/esp32/HardwareSerial.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index 7d9f26d2fae..6b001679467 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -66,6 +66,10 @@ class HardwareSerial: public Stream void flush( bool txOnly); size_t write(uint8_t); size_t write(const uint8_t *buffer, size_t size); + inline size_t write(const char * buffer, size_t size) + { + return write((uint8_t*) buffer, size); + } inline size_t write(const char * s) { From 69126cc6a200dd3035cb28b1e08656890b9970d9 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 19 Dec 2019 14:12:43 +0100 Subject: [PATCH 2/3] Add non-blocking HardwareSerial::read(buffer, size) extension (ESP8266 portability) --- cores/esp32/HardwareSerial.cpp | 18 ++++++++++++++++++ cores/esp32/HardwareSerial.h | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cores/esp32/HardwareSerial.cpp b/cores/esp32/HardwareSerial.cpp index 860c2c0f604..3619f4bc17b 100644 --- a/cores/esp32/HardwareSerial.cpp +++ b/cores/esp32/HardwareSerial.cpp @@ -131,6 +131,24 @@ int HardwareSerial::read(void) return -1; } +// read characters into buffer +// terminates if size characters have been read, or no further are pending +// returns the number of characters placed in the buffer +// the buffer is NOT null terminated. +size_t HardwareSerial::read(uint8_t *buffer, size_t size) +{ + size_t count = 0; + while(count < size) { + int c = read(); + if(c < 0) { + break; + } + *buffer++ = (char) c; + count++; + } + return count; +} + void HardwareSerial::flush(void) { uartFlush(_uart); diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index 6b001679467..820476748da 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -62,6 +62,11 @@ class HardwareSerial: public Stream int availableForWrite(void); int peek(void); int read(void); + size_t read(uint8_t *buffer, size_t size); + inline size_t read(char * buffer, size_t size) + { + return read((uint8_t*) buffer, size); + } void flush(void); void flush( bool txOnly); size_t write(uint8_t); @@ -70,7 +75,6 @@ class HardwareSerial: public Stream { return write((uint8_t*) buffer, size); } - inline size_t write(const char * s) { return write((uint8_t*) s, strlen(s)); From 78da3ffdc0d17349ef680cd564a0dbc587a31d19 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 19 Dec 2019 14:42:21 +0100 Subject: [PATCH 3/3] Refactor for fewer indirect calls. --- cores/esp32/HardwareSerial.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cores/esp32/HardwareSerial.cpp b/cores/esp32/HardwareSerial.cpp index 3619f4bc17b..be80ca27d1d 100644 --- a/cores/esp32/HardwareSerial.cpp +++ b/cores/esp32/HardwareSerial.cpp @@ -137,13 +137,13 @@ int HardwareSerial::read(void) // the buffer is NOT null terminated. size_t HardwareSerial::read(uint8_t *buffer, size_t size) { + size_t avail = available(); + if (size < avail) { + avail = size; + } size_t count = 0; - while(count < size) { - int c = read(); - if(c < 0) { - break; - } - *buffer++ = (char) c; + while(count < avail) { + *buffer++ = uartRead(_uart); count++; } return count;