--- 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();
}
--- 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;
}