# HG changeset patch # User Tero Marttila # Date 1397233841 -10800 # Node ID ef9fe98ebf7225d6950290d6bae67d4e69fb44f8 # Parent be139319a961a0f104e8f1776ef5d8a7f2d97259 serial: read buffering diff -r be139319a961 -r ef9fe98ebf72 src/hello-dmx.c --- a/src/hello-dmx.c Fri Apr 11 19:18:15 2014 +0300 +++ b/src/hello-dmx.c Fri Apr 11 19:30:41 2014 +0300 @@ -298,24 +298,16 @@ // sleep //led_on(); if (timer_sleep(timeout)) { - //c = ' '; led_toggle(); - c = 0; - - } else if ((c = serial_read())) { - // got serial data - c = input(c); + } - } else { - // unknown interrupt - c = '?'; + // input + while ((c = serial_read())) { + serial_write(input(c)); } + //led_off(); - if (c) - // respond - serial_write(c); - // output update(); } diff -r be139319a961 -r ef9fe98ebf72 src/serial.c --- a/src/serial.c Fri Apr 11 19:18:15 2014 +0300 +++ b/src/serial.c Fri Apr 11 19:30:41 2014 +0300 @@ -20,7 +20,13 @@ } serial_chars = SERIAL_CHARS_8; /** Serial state */ -char serial_rx = 0; +#define SERIAL_BUF 64 + +struct serial { + char buf[SERIAL_BUF]; + byte in, out; +} serial_rx; + char serial_tx = 0; void serial_enable (char rx, char tx); @@ -88,7 +94,10 @@ */ ISR(USART_RX_vect) { - serial_rx = UDR0; + serial_rx.buf[serial_rx.in++] = UDR0; + + if (serial_rx.in >= SERIAL_BUF) + serial_rx.in = 0; } /* @@ -107,10 +116,13 @@ char serial_read () { - char rx = serial_rx; + if (serial_rx.out == serial_rx.in) + return 0; - // rx buffer consumed - serial_rx = 0; + char rx = serial_rx.buf[serial_rx.out++]; + + if (serial_rx.out >= SERIAL_BUF) + serial_rx.out = 0; return rx; }