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

Committer:
jarkman
Date:
Wed Nov 18 21:27:15 2009 +0000
Revision:
0:b55ca3bb8017

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jarkman 0:b55ca3bb8017 1 #include "mbed.h"
jarkman 0:b55ca3bb8017 2 #include "SerialBuffered.h"
jarkman 0:b55ca3bb8017 3
jarkman 0:b55ca3bb8017 4 Serial loggerSerial(USBTX, USBRX);
jarkman 0:b55ca3bb8017 5
jarkman 0:b55ca3bb8017 6 // run this with p13 joined to p14 to test the SerialBuffered class
jarkman 0:b55ca3bb8017 7
jarkman 0:b55ca3bb8017 8 int main() {
jarkman 0:b55ca3bb8017 9
jarkman 0:b55ca3bb8017 10 SerialBuffered *b = new SerialBuffered( 1001, p13, p14);
jarkman 0:b55ca3bb8017 11
jarkman 0:b55ca3bb8017 12 b->baud( 112500 );
jarkman 0:b55ca3bb8017 13 b->setTimeout( 0.1 );
jarkman 0:b55ca3bb8017 14
jarkman 0:b55ca3bb8017 15 // write a bufferful
jarkman 0:b55ca3bb8017 16 for( int i = 0; i < 1000; i ++ )
jarkman 0:b55ca3bb8017 17 {
jarkman 0:b55ca3bb8017 18 b->putc( i % 0xff );
jarkman 0:b55ca3bb8017 19 }
jarkman 0:b55ca3bb8017 20
jarkman 0:b55ca3bb8017 21 // and check it all arrived
jarkman 0:b55ca3bb8017 22 for( int i = 0; i < 1000; i ++ )
jarkman 0:b55ca3bb8017 23 {
jarkman 0:b55ca3bb8017 24 uint8_t j = b->getc();
jarkman 0:b55ca3bb8017 25 if( j != i % 0xff )
jarkman 0:b55ca3bb8017 26 {
jarkman 0:b55ca3bb8017 27 loggerSerial.printf("Bad byte %x at %x\r\n", j, i );
jarkman 0:b55ca3bb8017 28 break;
jarkman 0:b55ca3bb8017 29 }
jarkman 0:b55ca3bb8017 30
jarkman 0:b55ca3bb8017 31 }
jarkman 0:b55ca3bb8017 32
jarkman 0:b55ca3bb8017 33 // write another bufferful
jarkman 0:b55ca3bb8017 34 for( int i = 0; i < 1000; i ++ )
jarkman 0:b55ca3bb8017 35 {
jarkman 0:b55ca3bb8017 36 b->putc( i % 0xff );
jarkman 0:b55ca3bb8017 37 }
jarkman 0:b55ca3bb8017 38
jarkman 0:b55ca3bb8017 39 // and check it arrived too, to confirm the circular buffer is working
jarkman 0:b55ca3bb8017 40 for( int i = 0; i < 1000; i ++ )
jarkman 0:b55ca3bb8017 41 {
jarkman 0:b55ca3bb8017 42 uint8_t j = b->getc();
jarkman 0:b55ca3bb8017 43 if( j != i % 0xff )
jarkman 0:b55ca3bb8017 44 {
jarkman 0:b55ca3bb8017 45 loggerSerial.printf("Bad byte %x at %x\r\n", j, i );
jarkman 0:b55ca3bb8017 46 break;
jarkman 0:b55ca3bb8017 47 }
jarkman 0:b55ca3bb8017 48 }
jarkman 0:b55ca3bb8017 49
jarkman 0:b55ca3bb8017 50 // write another bufferful, deliberately short
jarkman 0:b55ca3bb8017 51 for( int i = 0; i < 999; i ++ )
jarkman 0:b55ca3bb8017 52 {
jarkman 0:b55ca3bb8017 53 b->putc( i % 0xff );
jarkman 0:b55ca3bb8017 54 }
jarkman 0:b55ca3bb8017 55
jarkman 0:b55ca3bb8017 56
jarkman 0:b55ca3bb8017 57 // and read it back with readBytes
jarkman 0:b55ca3bb8017 58 b->setTimeout( 5 ); // set a long timeout so we can see we are waiting for it
jarkman 0:b55ca3bb8017 59
jarkman 0:b55ca3bb8017 60
jarkman 0:b55ca3bb8017 61 uint8_t *buff = (uint8_t*) malloc( 1000 );
jarkman 0:b55ca3bb8017 62 int nRead = b->readBytes( buff, 1000 );
jarkman 0:b55ca3bb8017 63
jarkman 0:b55ca3bb8017 64 loggerSerial.printf("readBytes got %d\r\n", nRead );
jarkman 0:b55ca3bb8017 65
jarkman 0:b55ca3bb8017 66 loggerSerial.printf("Done\r\n");
jarkman 0:b55ca3bb8017 67 }