From eb6e5143c422e13f9b07790a88473e4813024e92 Mon Sep 17 00:00:00 2001 From: robert-hh Date: Wed, 22 Mar 2023 20:31:50 +0100 Subject: [PATCH] nrf/modules/machine/uart: Prevent UART lock-up after a receive error. Like frame error, overrun, etc. Fix is provided by @ricksorensen. --- ports/nrf/modules/machine/uart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ports/nrf/modules/machine/uart.c b/ports/nrf/modules/machine/uart.c index 778b1c155d..fd176549d0 100644 --- a/ports/nrf/modules/machine/uart.c +++ b/ports/nrf/modules/machine/uart.c @@ -77,6 +77,7 @@ typedef struct _machine_hard_uart_buf_t { #define NRF_UART_HWFC_DISABLED NRF_UARTE_HWFC_DISABLED #define NRF_UART_PARITY_EXCLUDED NRF_UARTE_PARITY_EXCLUDED #define NRFX_UART_EVT_RX_DONE NRFX_UARTE_EVT_RX_DONE +#define NRFX_UART_EVT_ERROR NRFX_UARTE_EVT_ERROR #define NRF_UART_BAUDRATE_1200 NRF_UARTE_BAUDRATE_1200 #define NRF_UART_BAUDRATE_2400 NRF_UARTE_BAUDRATE_2400 @@ -136,6 +137,9 @@ STATIC void uart_event_handler(nrfx_uart_event_t const *p_event, void *p_context { ringbuf_put((ringbuf_t *)&self->buf.rx_ringbuf, chr); } + } else if (p_event->type == NRFX_UART_EVT_ERROR) { + // Perform a read to unlock UART in case of an error + nrfx_uart_rx(self->p_uart, &self->buf.rx_buf[0], 1); } }