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
jarkman 0:b55ca3bb8017 2 #include "mbed.h"
jarkman 0:b55ca3bb8017 3 #include "SerialBuffered.h"
jarkman 0:b55ca3bb8017 4
jarkman 0:b55ca3bb8017 5 extern Serial loggerSerial;
jarkman 0:b55ca3bb8017 6
jarkman 0:b55ca3bb8017 7 SerialBuffered::SerialBuffered( size_t bufferSize, PinName tx, PinName rx ) : Serial( tx, rx )
jarkman 0:b55ca3bb8017 8 {
jarkman 0:b55ca3bb8017 9 m_buffSize = 0;
jarkman 0:b55ca3bb8017 10 m_contentStart = 0;
jarkman 0:b55ca3bb8017 11 m_contentEnd = 0;
jarkman 0:b55ca3bb8017 12 m_timeout = 1.0;
jarkman 0:b55ca3bb8017 13
jarkman 0:b55ca3bb8017 14
jarkman 0:b55ca3bb8017 15 attach( this, &SerialBuffered::handleInterrupt );
jarkman 0:b55ca3bb8017 16
jarkman 0:b55ca3bb8017 17 m_buff = (uint8_t *) malloc( bufferSize );
jarkman 0:b55ca3bb8017 18 if( m_buff == NULL )
jarkman 0:b55ca3bb8017 19 {
jarkman 0:b55ca3bb8017 20 //loggerSerial.printf("SerialBuffered - failed to alloc buffer size %d\r\n", (int) bufferSize );
jarkman 0:b55ca3bb8017 21 }
jarkman 0:b55ca3bb8017 22 else
jarkman 0:b55ca3bb8017 23 {
jarkman 0:b55ca3bb8017 24 m_buffSize = bufferSize;
jarkman 0:b55ca3bb8017 25 }
jarkman 0:b55ca3bb8017 26 }
jarkman 0:b55ca3bb8017 27
jarkman 0:b55ca3bb8017 28
jarkman 0:b55ca3bb8017 29 SerialBuffered::~SerialBuffered()
jarkman 0:b55ca3bb8017 30 {
jarkman 0:b55ca3bb8017 31 if( m_buff )
jarkman 0:b55ca3bb8017 32 free( m_buff );
jarkman 0:b55ca3bb8017 33 }
jarkman 0:b55ca3bb8017 34
jarkman 0:b55ca3bb8017 35 void SerialBuffered::setTimeout( float seconds )
jarkman 0:b55ca3bb8017 36 {
jarkman 0:b55ca3bb8017 37 m_timeout = seconds;
jarkman 0:b55ca3bb8017 38 }
jarkman 0:b55ca3bb8017 39
jarkman 0:b55ca3bb8017 40 size_t SerialBuffered::readBytes( uint8_t *bytes, size_t requested )
jarkman 0:b55ca3bb8017 41 {
jarkman 0:b55ca3bb8017 42 int i = 0;
jarkman 0:b55ca3bb8017 43
jarkman 0:b55ca3bb8017 44 for( ; i < requested; )
jarkman 0:b55ca3bb8017 45 {
jarkman 0:b55ca3bb8017 46 int c = getc();
jarkman 0:b55ca3bb8017 47 if( c < 0 )
jarkman 0:b55ca3bb8017 48 break;
jarkman 0:b55ca3bb8017 49 bytes[i] = c;
jarkman 0:b55ca3bb8017 50 i++;
jarkman 0:b55ca3bb8017 51 }
jarkman 0:b55ca3bb8017 52
jarkman 0:b55ca3bb8017 53 return i;
jarkman 0:b55ca3bb8017 54
jarkman 0:b55ca3bb8017 55 }
jarkman 0:b55ca3bb8017 56
jarkman 0:b55ca3bb8017 57
jarkman 0:b55ca3bb8017 58 int SerialBuffered::getc()
jarkman 0:b55ca3bb8017 59 {
jarkman 0:b55ca3bb8017 60 m_timer.reset();
jarkman 0:b55ca3bb8017 61 m_timer.start();
jarkman 0:b55ca3bb8017 62 while( m_contentStart == m_contentEnd )
jarkman 0:b55ca3bb8017 63 {
jarkman 0:b55ca3bb8017 64
jarkman 0:b55ca3bb8017 65
jarkman 0:b55ca3bb8017 66 wait_ms( 1 );
jarkman 0:b55ca3bb8017 67 if( m_timeout > 0 && m_timer.read() > m_timeout )
jarkman 0:b55ca3bb8017 68 return EOF;
jarkman 0:b55ca3bb8017 69 }
jarkman 0:b55ca3bb8017 70
jarkman 0:b55ca3bb8017 71 m_timer.stop();
jarkman 0:b55ca3bb8017 72
jarkman 0:b55ca3bb8017 73 uint8_t result = m_buff[m_contentStart++];
jarkman 0:b55ca3bb8017 74 m_contentStart = m_contentStart % m_buffSize;
jarkman 0:b55ca3bb8017 75
jarkman 0:b55ca3bb8017 76
jarkman 0:b55ca3bb8017 77 return result;
jarkman 0:b55ca3bb8017 78 }
jarkman 0:b55ca3bb8017 79
jarkman 0:b55ca3bb8017 80
jarkman 0:b55ca3bb8017 81 int SerialBuffered::readable()
jarkman 0:b55ca3bb8017 82 {
jarkman 0:b55ca3bb8017 83 return m_contentStart != m_contentEnd ;
jarkman 0:b55ca3bb8017 84 }
jarkman 0:b55ca3bb8017 85
jarkman 0:b55ca3bb8017 86 void SerialBuffered::handleInterrupt()
jarkman 0:b55ca3bb8017 87 {
jarkman 0:b55ca3bb8017 88
jarkman 0:b55ca3bb8017 89 while( Serial::readable())
jarkman 0:b55ca3bb8017 90 {
jarkman 0:b55ca3bb8017 91 if( m_contentStart == (m_contentEnd +1) % m_buffSize)
jarkman 0:b55ca3bb8017 92 {
jarkman 0:b55ca3bb8017 93 loggerSerial.printf("SerialBuffered - buffer overrun, data lost!\r\n" );
jarkman 0:b55ca3bb8017 94 Serial::getc();
jarkman 0:b55ca3bb8017 95
jarkman 0:b55ca3bb8017 96 }
jarkman 0:b55ca3bb8017 97 else
jarkman 0:b55ca3bb8017 98 {
jarkman 0:b55ca3bb8017 99
jarkman 0:b55ca3bb8017 100 m_buff[ m_contentEnd ++ ] = Serial::getc();
jarkman 0:b55ca3bb8017 101 m_contentEnd = m_contentEnd % m_buffSize;
jarkman 0:b55ca3bb8017 102
jarkman 0:b55ca3bb8017 103
jarkman 0:b55ca3bb8017 104
jarkman 0:b55ca3bb8017 105 }
jarkman 0:b55ca3bb8017 106 }
jarkman 0:b55ca3bb8017 107 }
jarkman 0:b55ca3bb8017 108