Inherit from Serial and use software buffers for TX and RX. This allows the UART peripherals to operate in a IRQ driven mode. Overrides most (but not all) stdio functions as Serial did

Dependencies:   Buffer

Dependents:   LoRaWAN-demo-72-bootcamp

Fork of BufferedSerial by Sam Grove

Revision:
3:6b76fcf27545
Parent:
2:7e8a450a9101
Child:
4:2ba4d2e1f05d
--- a/BufferedSerial.cpp	Fri May 24 22:00:26 2013 +0000
+++ b/BufferedSerial.cpp	Wed Jun 12 20:40:15 2013 +0000
@@ -53,7 +53,7 @@
 
 int BufferedSerial::getc(void)
 {
-    return _rxbuf;   // note: pulling from the buffer
+    return _rxbuf;
 }
 
 int BufferedSerial::putc(int c)
@@ -114,7 +114,7 @@
 
 void BufferedSerial::rxIrq(void)
 {
-    // read from the peripheral and see if things are available
+    // read from the peripheral and make sure something is available
     if(serial_readable(&_serial))
     {
         _rxbuf = serial_getc(&_serial); // if so load them into a buffer
@@ -125,8 +125,8 @@
 
 void BufferedSerial::txIrq(void)
 {
-    // see if there is room in the hardware buffer and something is in the software buffer
-    if(serial_writable(&_serial) && _txbuf.available())
+    // see if there is room in the hardware fifo and if something is in the software fifo
+    while(serial_writable(&_serial) && _txbuf.available())
     {
         serial_putc(&_serial, (int)_txbuf.get());
     }
@@ -139,9 +139,9 @@
     // if already busy then the irq will pick this up
     if(serial_writable(&_serial))
     {
-        __disable_irq();    // make sure not to cause contention in the irq 
-        BufferedSerial::txIrq();    // prime the txirq - only write to hardware in one place
-        __enable_irq();
+        Serial::attach(NULL, Serial::TxIrq);    // make sure not to cause contention in the irq 
+        BufferedSerial::txIrq();                // only write to hardware in one place
+        Serial::attach(this, &BufferedSerial::txIrq, Serial::TxIrq);
     }
     
     return;