Serial Communicate Control Class. This has printf() and Tx & Rx buffer with (RxIRQ) RingBuffer, andmore can add user rxFunc to RxIrq.
mySerial.cpp@3:3658415b257b, 2016-11-15 (annotated)
- 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?
User | Revision | Line number | New 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 |