@@ -59,6 +59,7 @@ struct uart_ {
59
59
int baud_rate ;
60
60
bool rx_enabled ;
61
61
bool tx_enabled ;
62
+ bool overrun ;
62
63
uint8_t rx_pin ;
63
64
uint8_t tx_pin ;
64
65
struct uart_rx_buffer_ * rx_buffer ;
@@ -102,13 +103,31 @@ inline size_t uart_rx_fifo_available(uart_t* uart) {
102
103
return (USS (uart -> uart_nr ) >> USRXC ) & 0x7F ;
103
104
}
104
105
106
+ char overrun_str [] ICACHE_RODATA_ATTR STORE_ATTR = "uart input full!\r\n" ;
107
+
105
108
// Copy all the rx fifo bytes that fit into the rx buffer
106
109
inline void uart_rx_copy_fifo_to_buffer (uart_t * uart ) {
107
110
while (uart_rx_fifo_available (uart )){
108
111
size_t nextPos = (uart -> rx_buffer -> wpos + 1 ) % uart -> rx_buffer -> size ;
109
112
if (nextPos == uart -> rx_buffer -> rpos ) {
113
+
114
+ if (!uart -> overrun ) {
115
+ uart -> overrun = true;
116
+ os_printf_plus (overrun_str );
117
+ }
118
+
119
+ // a choice has to be made here,
120
+ // do we discard newest or oldest data?
121
+ #if 0
122
+ // discard newest data
110
123
// Stop copying if rx buffer is full
124
+ USF (uart -> uart_nr );
111
125
break ;
126
+ #else
127
+ // discard oldest data
128
+ if (++ uart -> rx_buffer -> rpos == uart -> rx_buffer -> size )
129
+ uart -> rx_buffer -> rpos = 0 ;
130
+ #endif
112
131
}
113
132
uint8_t data = USF (uart -> uart_nr );
114
133
uart -> rx_buffer -> buffer [uart -> rx_buffer -> wpos ] = data ;
@@ -281,6 +300,7 @@ uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, s
281
300
}
282
301
283
302
uart -> uart_nr = uart_nr ;
303
+ uart -> overrun = false;
284
304
285
305
switch (uart -> uart_nr ) {
286
306
case UART0 :
@@ -504,6 +524,15 @@ bool uart_rx_enabled(uart_t* uart)
504
524
return uart -> rx_enabled ;
505
525
}
506
526
527
+ bool uart_has_overrun (uart_t * uart )
528
+ {
529
+ if (uart == NULL || !uart -> overrun ) {
530
+ return false;
531
+ }
532
+ // clear flag
533
+ uart -> overrun = false;
534
+ return true;
535
+ }
507
536
508
537
static void uart_ignore_char (char c )
509
538
{
0 commit comments