From 4c272cf2f72a988adc46979637fdcc55e697bf16 Mon Sep 17 00:00:00 2001 From: Austin Hanson Date: Sat, 8 May 2021 16:11:54 -0500 Subject: [PATCH 1/3] Respecting framing and data overrun serial errors. - Adding checks for FE0 and DOR0 serial error - Tracking and adding ability to get what the error was --- avr/cores/MCUdude_corefiles/HardwareSerial.h | 4 ++++ .../MCUdude_corefiles/HardwareSerial_private.h | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/avr/cores/MCUdude_corefiles/HardwareSerial.h b/avr/cores/MCUdude_corefiles/HardwareSerial.h index 17000c2cc..0ce725fae 100755 --- a/avr/cores/MCUdude_corefiles/HardwareSerial.h +++ b/avr/cores/MCUdude_corefiles/HardwareSerial.h @@ -113,6 +113,8 @@ class HardwareSerial : public Stream unsigned char _rx_buffer[SERIAL_RX_BUFFER_SIZE]; unsigned char _tx_buffer[SERIAL_TX_BUFFER_SIZE]; + volatile int _rx_error; + public: inline HardwareSerial( volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, @@ -131,6 +133,8 @@ class HardwareSerial : public Stream inline size_t write(long n) { return write((uint8_t)n); } inline size_t write(unsigned int n) { return write((uint8_t)n); } inline size_t write(int n) { return write((uint8_t)n); } + inline int rx_error(void) { return _rx_error; } + inline void clear_rx_error(void) { _rx_error = 0; } using Print::write; // pull in write(str) and write(buf, size) from Print operator bool() { return true; } diff --git a/avr/cores/MCUdude_corefiles/HardwareSerial_private.h b/avr/cores/MCUdude_corefiles/HardwareSerial_private.h index badfa8733..4893b88d9 100755 --- a/avr/cores/MCUdude_corefiles/HardwareSerial_private.h +++ b/avr/cores/MCUdude_corefiles/HardwareSerial_private.h @@ -100,7 +100,7 @@ HardwareSerial::HardwareSerial( void HardwareSerial::_rx_complete_irq(void) { - if (bit_is_clear(*_ucsra, UPE0)) { + if (bit_is_clear(*_ucsra, UPE0) && bit_clear(*_ucsra, FE0) && bit_clear(*_ucsra, DOR0)) { // No Parity error, read byte and store it in the buffer if there is // room unsigned char c = *_udr; @@ -114,7 +114,19 @@ void HardwareSerial::_rx_complete_irq(void) _rx_buffer[_rx_buffer_head] = c; _rx_buffer_head = i; } - } else { + } + else { + // Set that we had an error + if (bit_is_set(*_ucsra, UPE0)) { + _rx_error = -2; + } + else if (bit_is_set(*_ucsra, FE0)) { + _rx_error = -3; + } + else + _rx_error = -4; + } + // Parity error, read byte but discard it *_udr; }; From 8ae0da8e5ee3f4aca2d0d64c4158ebb379d2d1c4 Mon Sep 17 00:00:00 2001 From: Austin Hanson Date: Sun, 9 May 2021 06:45:19 -0500 Subject: [PATCH 2/3] Fixing bit_is_clear call --- avr/cores/MCUdude_corefiles/HardwareSerial_private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/MCUdude_corefiles/HardwareSerial_private.h b/avr/cores/MCUdude_corefiles/HardwareSerial_private.h index 4893b88d9..a2d6a31b1 100755 --- a/avr/cores/MCUdude_corefiles/HardwareSerial_private.h +++ b/avr/cores/MCUdude_corefiles/HardwareSerial_private.h @@ -100,7 +100,7 @@ HardwareSerial::HardwareSerial( void HardwareSerial::_rx_complete_irq(void) { - if (bit_is_clear(*_ucsra, UPE0) && bit_clear(*_ucsra, FE0) && bit_clear(*_ucsra, DOR0)) { + if (bit_is_clear(*_ucsra, UPE0) && bit_is_clear(*_ucsra, FE0) && bit_is_clear(*_ucsra, DOR0)) { // No Parity error, read byte and store it in the buffer if there is // room unsigned char c = *_udr; From 63d1782fe2c5d975b159b22311a36e1493c0a83e Mon Sep 17 00:00:00 2001 From: Austin Hanson Date: Mon, 10 May 2021 15:03:17 -0500 Subject: [PATCH 3/3] Fixing build --- avr/cores/MCUdude_corefiles/HardwareSerial_private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/avr/cores/MCUdude_corefiles/HardwareSerial_private.h b/avr/cores/MCUdude_corefiles/HardwareSerial_private.h index a2d6a31b1..2f3b7a61a 100755 --- a/avr/cores/MCUdude_corefiles/HardwareSerial_private.h +++ b/avr/cores/MCUdude_corefiles/HardwareSerial_private.h @@ -123,7 +123,7 @@ void HardwareSerial::_rx_complete_irq(void) else if (bit_is_set(*_ucsra, FE0)) { _rx_error = -3; } - else + else { _rx_error = -4; }