Serial Communicate Control Class. This has printf() and Tx & Rx buffer with (RxIRQ) RingBuffer, andmore can add user rxFunc to RxIrq.

Dependencies:   RingBuffer

Committer:
AkinoriHashimoto
Date:
Tue Nov 15 06:27:34 2016 +0000
Revision:
3:3658415b257b
Parent:
2:d234f6f65fb9
add comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AkinoriHashimoto 0:fa077fb53f44 1 #include "mySerial.h"
AkinoriHashimoto 0:fa077fb53f44 2
AkinoriHashimoto 0:fa077fb53f44 3 mySerial::mySerial(PinName TX, PinName RX)
AkinoriHashimoto 0:fa077fb53f44 4 : serial(TX, RX)
AkinoriHashimoto 0:fa077fb53f44 5 {
AkinoriHashimoto 0:fa077fb53f44 6 }
AkinoriHashimoto 0:fa077fb53f44 7 void mySerial::init(int baudrate, int bit, int parity, int stop, bool CRLN)
AkinoriHashimoto 0:fa077fb53f44 8 {
AkinoriHashimoto 0:fa077fb53f44 9 serial.baud(baudrate);
AkinoriHashimoto 0:fa077fb53f44 10
AkinoriHashimoto 0:fa077fb53f44 11 // 力技
AkinoriHashimoto 0:fa077fb53f44 12 if (parity == SerialBase::Odd)
AkinoriHashimoto 0:fa077fb53f44 13 serial.format(bit, SerialBase::Odd, stop);
AkinoriHashimoto 0:fa077fb53f44 14 else if (parity == SerialBase::Even)
AkinoriHashimoto 0:fa077fb53f44 15 serial.format(bit, SerialBase::Even, stop); // 8bit, NonParity, 1stopbit
AkinoriHashimoto 0:fa077fb53f44 16 else// if (parity == SerialBase::None)
AkinoriHashimoto 0:fa077fb53f44 17 serial.format(bit, SerialBase::None, stop); // 8bit, NonParity, 1stopbit
AkinoriHashimoto 0:fa077fb53f44 18
AkinoriHashimoto 0:fa077fb53f44 19 // attach rxIrq. because, rx buf of serial equals to 16 Bytes.
AkinoriHashimoto 0:fa077fb53f44 20 this->serial.attach(this, &mySerial::_readIrq, Serial::RxIrq);
AkinoriHashimoto 0:fa077fb53f44 21 // Tx Buf empty Interrupt.
AkinoriHashimoto 0:fa077fb53f44 22 this->serial.attach(this, &mySerial::putcIrq, Serial::TxIrq);
AkinoriHashimoto 0:fa077fb53f44 23
AkinoriHashimoto 0:fa077fb53f44 24 CR= '\r';
AkinoriHashimoto 0:fa077fb53f44 25 if(CRLN)
AkinoriHashimoto 0:fa077fb53f44 26 CR= "\r\n";
AkinoriHashimoto 0:fa077fb53f44 27 return;
AkinoriHashimoto 0:fa077fb53f44 28 }
AkinoriHashimoto 0:fa077fb53f44 29
AkinoriHashimoto 0:fa077fb53f44 30 void mySerial::setAttachRx(void (*fptr)(char))
AkinoriHashimoto 0:fa077fb53f44 31 {
AkinoriHashimoto 0:fa077fb53f44 32 // Serial.attachから呼ばれる_readIrq()内から、fptrをCall.
AkinoriHashimoto 0:fa077fb53f44 33 fptrRxIrq= fptr;
AkinoriHashimoto 0:fa077fb53f44 34 return;
AkinoriHashimoto 0:fa077fb53f44 35 }
AkinoriHashimoto 0:fa077fb53f44 36
AkinoriHashimoto 0:fa077fb53f44 37 bool mySerial::readable()
AkinoriHashimoto 0:fa077fb53f44 38 {
AkinoriHashimoto 0:fa077fb53f44 39 return serial.readable() || !ringBufRx.empty();
AkinoriHashimoto 0:fa077fb53f44 40 }
AkinoriHashimoto 0:fa077fb53f44 41
AkinoriHashimoto 0:fa077fb53f44 42 string mySerial::get() // public:
AkinoriHashimoto 0:fa077fb53f44 43 {
AkinoriHashimoto 0:fa077fb53f44 44 _read();
AkinoriHashimoto 0:fa077fb53f44 45 if(ringBufRx.empty())
AkinoriHashimoto 0:fa077fb53f44 46 return "";
AkinoriHashimoto 0:fa077fb53f44 47 return ringBufRx.get();
AkinoriHashimoto 0:fa077fb53f44 48 }
AkinoriHashimoto 0:fa077fb53f44 49
AkinoriHashimoto 0:fa077fb53f44 50 string mySerial::getLine()
AkinoriHashimoto 0:fa077fb53f44 51 {
AkinoriHashimoto 0:fa077fb53f44 52 _read();
AkinoriHashimoto 0:fa077fb53f44 53 // RingBuf is empty of doesm't find CR.
AkinoriHashimoto 0:fa077fb53f44 54 if(ringBufRx.empty() || !ringBufRx.chkCR())
AkinoriHashimoto 0:fa077fb53f44 55 return "";
AkinoriHashimoto 0:fa077fb53f44 56
AkinoriHashimoto 0:fa077fb53f44 57 return ringBufRx.getLine();
AkinoriHashimoto 0:fa077fb53f44 58 }
AkinoriHashimoto 0:fa077fb53f44 59
AkinoriHashimoto 0:fa077fb53f44 60 void mySerial::sendLine(string str, bool addCR)
AkinoriHashimoto 0:fa077fb53f44 61 {
AkinoriHashimoto 0:fa077fb53f44 62 if(addCR)
AkinoriHashimoto 0:fa077fb53f44 63 str += "\r\n";
AkinoriHashimoto 0:fa077fb53f44 64 this->printf(str.c_str()); // _putc()が呼ばれるはず
AkinoriHashimoto 0:fa077fb53f44 65 return;
AkinoriHashimoto 0:fa077fb53f44 66 }
AkinoriHashimoto 0:fa077fb53f44 67
AkinoriHashimoto 0:fa077fb53f44 68 int mySerial::_putc(int val) // for printf()
AkinoriHashimoto 0:fa077fb53f44 69 {
AkinoriHashimoto 0:fa077fb53f44 70 ringBufTx.set(val);
AkinoriHashimoto 0:fa077fb53f44 71 // serial.putc(val);
AkinoriHashimoto 0:fa077fb53f44 72 putcIrq();
AkinoriHashimoto 0:fa077fb53f44 73 return val;
AkinoriHashimoto 0:fa077fb53f44 74 }
AkinoriHashimoto 0:fa077fb53f44 75
AkinoriHashimoto 0:fa077fb53f44 76 int mySerial::_getc() // for "Stream"
AkinoriHashimoto 0:fa077fb53f44 77 {
AkinoriHashimoto 2:d234f6f65fb9 78 return ringBufRx.getc();
AkinoriHashimoto 2:d234f6f65fb9 79 // return -1;//mySerial.getc();
AkinoriHashimoto 0:fa077fb53f44 80 }
AkinoriHashimoto 0:fa077fb53f44 81
AkinoriHashimoto 0:fa077fb53f44 82 void mySerial::putcIrq(void)
AkinoriHashimoto 0:fa077fb53f44 83 {
AkinoriHashimoto 0:fa077fb53f44 84 if(!serial.writeable() || ringBufTx.empty())
AkinoriHashimoto 0:fa077fb53f44 85 return;
AkinoriHashimoto 0:fa077fb53f44 86
AkinoriHashimoto 0:fa077fb53f44 87 serial.putc(ringBufTx.getc());
AkinoriHashimoto 0:fa077fb53f44 88 return;
AkinoriHashimoto 0:fa077fb53f44 89 }
AkinoriHashimoto 0:fa077fb53f44 90
AkinoriHashimoto 0:fa077fb53f44 91 // Internal READ()
AkinoriHashimoto 0:fa077fb53f44 92 void mySerial::_readIrq(void)
AkinoriHashimoto 0:fa077fb53f44 93 {
AkinoriHashimoto 0:fa077fb53f44 94 if(!serial.readable())
AkinoriHashimoto 0:fa077fb53f44 95 return;
AkinoriHashimoto 0:fa077fb53f44 96
AkinoriHashimoto 0:fa077fb53f44 97 char chr= serial.getc();
AkinoriHashimoto 0:fa077fb53f44 98 ringBufRx.set(chr);
AkinoriHashimoto 0:fa077fb53f44 99
AkinoriHashimoto 0:fa077fb53f44 100 if(this->fptrRxIrq == NULL)
AkinoriHashimoto 0:fa077fb53f44 101 return;
AkinoriHashimoto 0:fa077fb53f44 102
AkinoriHashimoto 0:fa077fb53f44 103 fptrRxIrq(chr);
AkinoriHashimoto 0:fa077fb53f44 104 return;
AkinoriHashimoto 0:fa077fb53f44 105 }
AkinoriHashimoto 0:fa077fb53f44 106 void mySerial::_read()
AkinoriHashimoto 0:fa077fb53f44 107 {
AkinoriHashimoto 0:fa077fb53f44 108 // Bufferを吸い尽くす
AkinoriHashimoto 0:fa077fb53f44 109 while(serial.readable())
AkinoriHashimoto 0:fa077fb53f44 110 ringBufRx.set((char)serial.getc());
AkinoriHashimoto 0:fa077fb53f44 111 return; // Bufferになくなった
AkinoriHashimoto 0:fa077fb53f44 112 }
AkinoriHashimoto 0:fa077fb53f44 113
AkinoriHashimoto 0:fa077fb53f44 114 // EOF