This is the SerialBuffered class, which wraps Serial and adds interrupt-powered buffered reading (so it will catch inbound data even when your app is busy doing something else) and simple read timeouts. There's a tiny demo app in there too.

Dependencies:   mbed

main.cpp

Committer:
jarkman
Date:
2009-11-18
Revision:
0:b55ca3bb8017

File content as of revision 0:b55ca3bb8017:

#include "mbed.h"
#include "SerialBuffered.h"

Serial loggerSerial(USBTX, USBRX);

// run this with p13 joined to p14 to test the SerialBuffered class 

int main() {

   SerialBuffered *b = new SerialBuffered( 1001, p13, p14);
   
   b->baud( 112500 );
   b->setTimeout( 0.1 );
   
    // write a bufferful   
   for( int i = 0; i < 1000; i ++ )
   {
       b->putc( i % 0xff );
   }
   
   // and check it all arrived
   for( int i = 0; i < 1000; i ++ )
   {
       uint8_t j = b->getc();
       if( j != i % 0xff )
       {
           loggerSerial.printf("Bad byte %x at %x\r\n", j, i );
           break;
       }
       
   }
    
   // write another bufferful 
   for( int i = 0; i < 1000; i ++ )
   {
       b->putc( i % 0xff );
   }
   
   // and check it arrived too, to confirm the circular buffer is working
   for( int i = 0; i < 1000; i ++ )
   {
       uint8_t j = b->getc();
       if( j != i % 0xff )
       {
           loggerSerial.printf("Bad byte %x at %x\r\n", j, i );
           break;
       }
   }
   
    // write another bufferful, deliberately short
   for( int i = 0; i < 999; i ++ )
   {
       b->putc( i % 0xff );
   }


   // and read it back with readBytes   
   b->setTimeout( 5 ); // set a long timeout so we can see we are waiting for it


   uint8_t *buff = (uint8_t*) malloc( 1000 );
   int nRead = b->readBytes( buff, 1000 );
   
   loggerSerial.printf("readBytes got %d\r\n", nRead );       
   
   loggerSerial.printf("Done\r\n");    
}