diff --git a/cores/portduino/linux/LinuxSerial.cpp b/cores/portduino/linux/LinuxSerial.cpp index cb18cd7..6bec23d 100644 --- a/cores/portduino/linux/LinuxSerial.cpp +++ b/cores/portduino/linux/LinuxSerial.cpp @@ -186,13 +186,26 @@ namespace arduino { } int LinuxSerial::peek(void) { + if (hasPeeked) return peekedByte; + unsigned char c = 0; + ssize_t rv = ::read(serial_port, &c, 1); + if (rv == 1) { + hasPeeked = true; + peekedByte = (int)c; + return peekedByte; + } return -1; } int LinuxSerial::read(void) { - int buf = 0; - ::read(serial_port, &buf, 1); - return buf; + if (hasPeeked) { + hasPeeked = false; + return peekedByte; + } + unsigned char c = 0; + ssize_t rv = ::read(serial_port, &c, 1); + if (rv == 1) return (int)c; + return -1; } void LinuxSerial::flush(void) { diff --git a/cores/portduino/linux/LinuxSerial.h b/cores/portduino/linux/LinuxSerial.h index 95249b6..fd3185a 100644 --- a/cores/portduino/linux/LinuxSerial.h +++ b/cores/portduino/linux/LinuxSerial.h @@ -24,6 +24,10 @@ namespace arduino { virtual size_t write(uint8_t); using Print::write; // pull in write(str) and write(buf, size) from Print virtual operator bool(); + + private: + bool hasPeeked = false; + int peekedByte = 0; }; class SimSerial : public HardwareSerial {