src/serial.c
changeset 69 ef9fe98ebf72
parent 53 dfe67409fbcd
--- 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;
 }