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:
Thu Jan 21 06:35:10 2016 +0000
Revision:
0:fa077fb53f44
Child:
1:3ebb72e37fc5
1st publish

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 /*
AkinoriHashimoto 0:fa077fb53f44 53 string tmp= this->read();
AkinoriHashimoto 0:fa077fb53f44 54 if(tmp.empty())
AkinoriHashimoto 0:fa077fb53f44 55 return "";
AkinoriHashimoto 0:fa077fb53f44 56
AkinoriHashimoto 0:fa077fb53f44 57 // tmp is not empty.
AkinoriHashimoto 0:fa077fb53f44 58 int idx= tmp.rfind('\r');
AkinoriHashimoto 0:fa077fb53f44 59 if(idx == string::npos) {
AkinoriHashimoto 0:fa077fb53f44 60 ringBufRx.set(tmp); // 戻す
AkinoriHashimoto 0:fa077fb53f44 61 return "";
AkinoriHashimoto 0:fa077fb53f44 62 }
AkinoriHashimoto 0:fa077fb53f44 63 */
AkinoriHashimoto 0:fa077fb53f44 64
AkinoriHashimoto 0:fa077fb53f44 65 _read();
AkinoriHashimoto 0:fa077fb53f44 66 // RingBuf is empty of doesm't find CR.
AkinoriHashimoto 0:fa077fb53f44 67 if(ringBufRx.empty() || !ringBufRx.chkCR())
AkinoriHashimoto 0:fa077fb53f44 68 return "";
AkinoriHashimoto 0:fa077fb53f44 69
AkinoriHashimoto 0:fa077fb53f44 70 return ringBufRx.getLine();
AkinoriHashimoto 0:fa077fb53f44 71 /*
AkinoriHashimoto 0:fa077fb53f44 72 string tmp= ringBufRx.get();
AkinoriHashimoto 0:fa077fb53f44 73 // find \r
AkinoriHashimoto 0:fa077fb53f44 74 if(tmp[++idx] == '\n')
AkinoriHashimoto 0:fa077fb53f44 75 idx++;
AkinoriHashimoto 0:fa077fb53f44 76
AkinoriHashimoto 0:fa077fb53f44 77 // idxは改行後の文字先頭Indexを示す。
AkinoriHashimoto 0:fa077fb53f44 78 string rtn= tmp.substr(0, idx);
AkinoriHashimoto 0:fa077fb53f44 79 tmp= tmp.substr(idx);
AkinoriHashimoto 0:fa077fb53f44 80 ringBufRx.set(tmp);
AkinoriHashimoto 0:fa077fb53f44 81 return rtn;
AkinoriHashimoto 0:fa077fb53f44 82 */
AkinoriHashimoto 0:fa077fb53f44 83 }
AkinoriHashimoto 0:fa077fb53f44 84
AkinoriHashimoto 0:fa077fb53f44 85 void mySerial::sendLine(string str, bool addCR)
AkinoriHashimoto 0:fa077fb53f44 86 {
AkinoriHashimoto 0:fa077fb53f44 87 if(addCR)
AkinoriHashimoto 0:fa077fb53f44 88 str += "\r\n";
AkinoriHashimoto 0:fa077fb53f44 89 this->printf(str.c_str()); // _putc()が呼ばれるはず
AkinoriHashimoto 0:fa077fb53f44 90 return;
AkinoriHashimoto 0:fa077fb53f44 91 }
AkinoriHashimoto 0:fa077fb53f44 92
AkinoriHashimoto 0:fa077fb53f44 93 int mySerial::_putc(int val) // for printf()
AkinoriHashimoto 0:fa077fb53f44 94 {
AkinoriHashimoto 0:fa077fb53f44 95 ringBufTx.set(val);
AkinoriHashimoto 0:fa077fb53f44 96 // serial.putc(val);
AkinoriHashimoto 0:fa077fb53f44 97 putcIrq();
AkinoriHashimoto 0:fa077fb53f44 98 return val;
AkinoriHashimoto 0:fa077fb53f44 99 }
AkinoriHashimoto 0:fa077fb53f44 100
AkinoriHashimoto 0:fa077fb53f44 101 int mySerial::_getc() // for "Stream"
AkinoriHashimoto 0:fa077fb53f44 102 {
AkinoriHashimoto 0:fa077fb53f44 103 return -1;//mySerial.getc();
AkinoriHashimoto 0:fa077fb53f44 104 }
AkinoriHashimoto 0:fa077fb53f44 105
AkinoriHashimoto 0:fa077fb53f44 106 void mySerial::putcIrq(void)
AkinoriHashimoto 0:fa077fb53f44 107 {
AkinoriHashimoto 0:fa077fb53f44 108 if(!serial.writeable() || ringBufTx.empty())
AkinoriHashimoto 0:fa077fb53f44 109 return;
AkinoriHashimoto 0:fa077fb53f44 110
AkinoriHashimoto 0:fa077fb53f44 111 serial.putc(ringBufTx.getc());
AkinoriHashimoto 0:fa077fb53f44 112 return;
AkinoriHashimoto 0:fa077fb53f44 113 }
AkinoriHashimoto 0:fa077fb53f44 114
AkinoriHashimoto 0:fa077fb53f44 115 // Internal READ()
AkinoriHashimoto 0:fa077fb53f44 116 void mySerial::_readIrq(void)
AkinoriHashimoto 0:fa077fb53f44 117 {
AkinoriHashimoto 0:fa077fb53f44 118 if(!serial.readable())
AkinoriHashimoto 0:fa077fb53f44 119 return;
AkinoriHashimoto 0:fa077fb53f44 120
AkinoriHashimoto 0:fa077fb53f44 121 char chr= serial.getc();
AkinoriHashimoto 0:fa077fb53f44 122 ringBufRx.set(chr);
AkinoriHashimoto 0:fa077fb53f44 123
AkinoriHashimoto 0:fa077fb53f44 124 if(this->fptrRxIrq == NULL)
AkinoriHashimoto 0:fa077fb53f44 125 return;
AkinoriHashimoto 0:fa077fb53f44 126
AkinoriHashimoto 0:fa077fb53f44 127 fptrRxIrq(chr);
AkinoriHashimoto 0:fa077fb53f44 128 return;
AkinoriHashimoto 0:fa077fb53f44 129 }
AkinoriHashimoto 0:fa077fb53f44 130 void mySerial::_read()
AkinoriHashimoto 0:fa077fb53f44 131 {
AkinoriHashimoto 0:fa077fb53f44 132 // Bufferを吸い尽くす
AkinoriHashimoto 0:fa077fb53f44 133 while(serial.readable())
AkinoriHashimoto 0:fa077fb53f44 134 ringBufRx.set((char)serial.getc());
AkinoriHashimoto 0:fa077fb53f44 135 return; // Bufferになくなった
AkinoriHashimoto 0:fa077fb53f44 136 }
AkinoriHashimoto 0:fa077fb53f44 137
AkinoriHashimoto 0:fa077fb53f44 138 // EOF