fix uart recv in non-intr mode
[aversive.git] / modules / comm / uart / uart_recv_nowait.c
index c4c1a04..2872d21 100644 (file)
@@ -31,13 +31,23 @@ int uart_recv_nowait(uint8_t num)
        char elt = 0;
        uint8_t flags;
        
-       IRQ_LOCK(flags);
-       if( !CIRBUF_IS_EMPTY(&g_rx_fifo[num]) ) {
-               elt = cirbuf_get_tail(&g_rx_fifo[num]);
-               cirbuf_del_tail(&g_rx_fifo[num]);
+       /* if interrupt mode is off, we have to check the status
+        * register */
+       if (!(*uart_regs[num].ucsrb & (1 << RXCIE))) {
+               if ( !(*uart_regs[num].ucsra & (1 << RXC)) )
+                       return -1;
+               return uart_get_udr(num);
+       }
+       /* else check the fifo */
+       else {
+               IRQ_LOCK(flags);
+               if( !CIRBUF_IS_EMPTY(&g_rx_fifo[num]) ) {
+                       elt = cirbuf_get_tail(&g_rx_fifo[num]);
+                       cirbuf_del_tail(&g_rx_fifo[num]);
+                       IRQ_UNLOCK(flags);
+                       return (int)elt;
+               }
                IRQ_UNLOCK(flags);
-               return (int)elt;
+               return -1;
        }
-       IRQ_UNLOCK(flags);
-       return (-1);
 }