Tetsuya Yamamoto / Mbed 2 deprecated BufferSerial

Dependencies:   mbed

Committer:
tetsu_0207
Date:
Mon Nov 16 08:33:33 2020 +0000
Revision:
1:476b874003d8
Parent:
0:07be23bfcae4
Child:
2:304d0e762287
version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tetsu_0207 0:07be23bfcae4 1 #include "BufferSerial.h"
tetsu_0207 0:07be23bfcae4 2
tetsu_0207 1:476b874003d8 3 BufferSerial::BufferSerial(PinName tx, PinName rx,int baud,int timeout)
tetsu_0207 1:476b874003d8 4 :RawSerial(tx,rx,baud)
tetsu_0207 0:07be23bfcae4 5 {
tetsu_0207 0:07be23bfcae4 6 // initialize functions
tetsu_0207 1:476b874003d8 7 _rx_buffer_head = 0;
tetsu_0207 1:476b874003d8 8 _rx_buffer_tail = 0;
tetsu_0207 1:476b874003d8 9 // time out
tetsu_0207 1:476b874003d8 10 timer_ms = timeout;
tetsu_0207 1:476b874003d8 11 timer.start();
tetsu_0207 0:07be23bfcae4 12 // attach
tetsu_0207 1:476b874003d8 13 RawSerial::attach(callback(this,&BufferSerial::serial_rx), Serial::RxIrq);
tetsu_0207 1:476b874003d8 14 }
tetsu_0207 1:476b874003d8 15
tetsu_0207 1:476b874003d8 16 int BufferSerial::available(void)
tetsu_0207 1:476b874003d8 17 {
tetsu_0207 1:476b874003d8 18 return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
tetsu_0207 1:476b874003d8 19 }
tetsu_0207 1:476b874003d8 20
tetsu_0207 1:476b874003d8 21 int BufferSerial::read(void)
tetsu_0207 1:476b874003d8 22 {
tetsu_0207 1:476b874003d8 23 if (_rx_buffer_head == _rx_buffer_tail) {
tetsu_0207 1:476b874003d8 24 return -1;
tetsu_0207 1:476b874003d8 25 } else {
tetsu_0207 1:476b874003d8 26 unsigned char c = _rx_buffer[_rx_buffer_tail];
tetsu_0207 1:476b874003d8 27 _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
tetsu_0207 1:476b874003d8 28 return c;
tetsu_0207 1:476b874003d8 29 }
tetsu_0207 0:07be23bfcae4 30 }
tetsu_0207 0:07be23bfcae4 31
tetsu_0207 1:476b874003d8 32 size_t BufferSerial::readBytesUntil(char charactor,char *buffer,int length)
tetsu_0207 1:476b874003d8 33 {
tetsu_0207 1:476b874003d8 34 size_t index = 0;
tetsu_0207 1:476b874003d8 35 while (index < length) {
tetsu_0207 1:476b874003d8 36 int c = timedRead();
tetsu_0207 1:476b874003d8 37 if (c < 0 || c == charactor) break;
tetsu_0207 1:476b874003d8 38 *buffer++ = (char)c;
tetsu_0207 1:476b874003d8 39 index++;
tetsu_0207 1:476b874003d8 40 }
tetsu_0207 1:476b874003d8 41 return index;
tetsu_0207 0:07be23bfcae4 42 }
tetsu_0207 0:07be23bfcae4 43
tetsu_0207 1:476b874003d8 44 void BufferSerial::serial_rx(void)
tetsu_0207 1:476b874003d8 45 {
tetsu_0207 1:476b874003d8 46 while(RawSerial::readable()) {
tetsu_0207 1:476b874003d8 47 unsigned char c = RawSerial::getc();
tetsu_0207 1:476b874003d8 48 rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;
tetsu_0207 1:476b874003d8 49 if (i != _rx_buffer_tail) {
tetsu_0207 1:476b874003d8 50 _rx_buffer[_rx_buffer_head] = c;
tetsu_0207 1:476b874003d8 51 _rx_buffer_head = i;
tetsu_0207 1:476b874003d8 52 }
tetsu_0207 1:476b874003d8 53 }
tetsu_0207 0:07be23bfcae4 54 }
tetsu_0207 0:07be23bfcae4 55
tetsu_0207 1:476b874003d8 56 int BufferSerial::timedRead()
tetsu_0207 1:476b874003d8 57 {
tetsu_0207 1:476b874003d8 58 int c;
tetsu_0207 1:476b874003d8 59 timer.reset();
tetsu_0207 1:476b874003d8 60 _startMillis = timer.read_ms();
tetsu_0207 1:476b874003d8 61 do {
tetsu_0207 1:476b874003d8 62 c = read();
tetsu_0207 1:476b874003d8 63 if (c >= 0) return c;
tetsu_0207 1:476b874003d8 64 } while(timer.read_ms() - _startMillis < _timeout);
tetsu_0207 1:476b874003d8 65 return -1; // -1 indicates timeout
tetsu_0207 0:07be23bfcae4 66 }