Buffered Serial Port Driver for RTOS

Dependents:   nucleo_cannonball PiballNeoController

Buffered Serial Port Driver for RTOS

  • ISR driven, ring buffered IO operation
  • IO operations are idle waiting, don't waste time in RTOS :D
  • Can use external buffers
  • Based on mbed RawSerial

Example

SerialDriver Example

#include "SerialDriver.h"

SerialDriver pc(USBTX, USBRX);

int main()
{
    // setup serial port
    pc.baud(9600);
    
    // print some text
    pc.puts("This is just a string.\r\n");
    pc.printf("But this is a %s with integer %i and float %f.\r\n", "formatted text", 123, 0.456f);
    
    // now lets behave like a null modem 
    while(1)
       pc.putc(pc.getc());
}

Look at the API Documentation for more Examples.

Dependencies

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Import librarymbed-rtos

Official mbed Real Time Operating System based on the RTX implementation of the CMSIS-RTOS API open standard.

If you find a bug, please help me to fix it. Send me a message. You can help me a lot: Write a demo program that causes the bug reproducible.

Revision:
3:ea9719695b6a
Parent:
0:cd0d79be0c1a
Child:
4:a41e47716932
--- a/SerialDriver.cpp	Thu Jan 15 09:53:09 2015 +0000
+++ b/SerialDriver.cpp	Mon Jan 26 19:21:56 2015 +0000
@@ -35,10 +35,13 @@
     rxIn= rxOut= 0;
     txCount= rxCount= 0;
     
+    // reset drop counters
+    numTxDrops= 0;
+    numRxDrops= 0;
+    
     // attach interrupt routines
     attach(this, &SerialDriver::onTxIrq, TxIrq);
     attach(this, &SerialDriver::onRxIrq, RxIrq);
-    
 }
 
 int SerialDriver::putc(int c, unsigned int timeoutMs)
@@ -58,6 +61,7 @@
         disableTxInterrupt();
         if(isTxBufferFull()) // still full? drop byte!
         {
+            numTxDrops++;
             enableTxInterrupt();
             return 0;
         }
@@ -152,7 +156,9 @@
             rxBuffer[rxIn]= (unsigned char)c;
             rxIn= (rxIn+1) % rxBufferLength;
             rxCount++;
-        }   // else drop byte :(
+        }
+        else    // drop byte :(
+            numRxDrops++;
     }
     
     if(wasEmpty && !isRxBufferEmpty())   // more bytes can go
@@ -212,4 +218,4 @@
     return length;
 } 
 
-// for XTN
+// still thinking of XTN