serial_extend library for array data transmission and reception
Dependents: receives_robot_wheel
serial_extend.cpp@1:e808dd01f134, 2014-10-05 (annotated)
- Committer:
- bousiya03
- Date:
- Sun Oct 05 01:00:00 2014 +0000
- Revision:
- 1:e808dd01f134
- Parent:
- 0:fbf5705f90cc
test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bousiya03 | 0:fbf5705f90cc | 1 | /* |
bousiya03 | 0:fbf5705f90cc | 2 | *mbed Multibyte Serial Library |
bousiya03 | 0:fbf5705f90cc | 3 | */ |
bousiya03 | 0:fbf5705f90cc | 4 | |
bousiya03 | 0:fbf5705f90cc | 5 | #include "mbed.h" |
bousiya03 | 0:fbf5705f90cc | 6 | #include "serial_extend.h" |
bousiya03 | 0:fbf5705f90cc | 7 | #include "RawSerial.h" |
bousiya03 | 0:fbf5705f90cc | 8 | |
bousiya03 | 0:fbf5705f90cc | 9 | |
bousiya03 | 0:fbf5705f90cc | 10 | serial_extend::serial_extend(PinName tx,PinName rx) : __serial__(tx,rx){ |
bousiya03 | 0:fbf5705f90cc | 11 | |
bousiya03 | 0:fbf5705f90cc | 12 | /* |
bousiya03 | 0:fbf5705f90cc | 13 | switch(state){ |
bousiya03 | 0:fbf5705f90cc | 14 | |
bousiya03 | 0:fbf5705f90cc | 15 | case read: |
bousiya03 | 0:fbf5705f90cc | 16 | { |
bousiya03 | 0:fbf5705f90cc | 17 | __serial__.attach(this,&serial_extend::RX,Serial::RxIrq); |
bousiya03 | 0:fbf5705f90cc | 18 | uint8_t k = __serial__.getc(); |
bousiya03 | 0:fbf5705f90cc | 19 | break; |
bousiya03 | 0:fbf5705f90cc | 20 | } |
bousiya03 | 0:fbf5705f90cc | 21 | |
bousiya03 | 0:fbf5705f90cc | 22 | case write: |
bousiya03 | 0:fbf5705f90cc | 23 | { |
bousiya03 | 0:fbf5705f90cc | 24 | __serial__.attach(this,&serial_extend::TX,Serial::TxIrq); |
bousiya03 | 0:fbf5705f90cc | 25 | __serial__.putc(1); |
bousiya03 | 0:fbf5705f90cc | 26 | break; |
bousiya03 | 0:fbf5705f90cc | 27 | } |
bousiya03 | 0:fbf5705f90cc | 28 | |
bousiya03 | 0:fbf5705f90cc | 29 | case both: |
bousiya03 | 0:fbf5705f90cc | 30 | { |
bousiya03 | 0:fbf5705f90cc | 31 | __serial__.attach(this,&serial_extend::RX,Serial::RxIrq); |
bousiya03 | 0:fbf5705f90cc | 32 | uint8_t m = __serial__.getc(); |
bousiya03 | 0:fbf5705f90cc | 33 | __serial__.attach(this,&serial_extend::TX,Serial::TxIrq); |
bousiya03 | 0:fbf5705f90cc | 34 | __serial__.putc(1); |
bousiya03 | 0:fbf5705f90cc | 35 | } |
bousiya03 | 0:fbf5705f90cc | 36 | |
bousiya03 | 0:fbf5705f90cc | 37 | } |
bousiya03 | 0:fbf5705f90cc | 38 | */ |
bousiya03 | 0:fbf5705f90cc | 39 | } |
bousiya03 | 0:fbf5705f90cc | 40 | |
bousiya03 | 0:fbf5705f90cc | 41 | void serial_extend::start_write(){ |
bousiya03 | 0:fbf5705f90cc | 42 | |
bousiya03 | 0:fbf5705f90cc | 43 | __stop_write = 0; |
bousiya03 | 0:fbf5705f90cc | 44 | __serial__.attach(this,&serial_extend::TX,RawSerial::TxIrq); |
bousiya03 | 0:fbf5705f90cc | 45 | __serial__.putc(1); |
bousiya03 | 0:fbf5705f90cc | 46 | |
bousiya03 | 0:fbf5705f90cc | 47 | } |
bousiya03 | 0:fbf5705f90cc | 48 | |
bousiya03 | 0:fbf5705f90cc | 49 | void serial_extend::stop_write(){ |
bousiya03 | 0:fbf5705f90cc | 50 | |
bousiya03 | 0:fbf5705f90cc | 51 | __stop_write = 1; |
bousiya03 | 0:fbf5705f90cc | 52 | |
bousiya03 | 0:fbf5705f90cc | 53 | } |
bousiya03 | 0:fbf5705f90cc | 54 | |
bousiya03 | 0:fbf5705f90cc | 55 | |
bousiya03 | 0:fbf5705f90cc | 56 | void serial_extend::start_read(){ |
bousiya03 | 0:fbf5705f90cc | 57 | |
bousiya03 | 0:fbf5705f90cc | 58 | __stop_read = 0; |
bousiya03 | 0:fbf5705f90cc | 59 | __serial__.attach(this,&serial_extend::RX,RawSerial::RxIrq); |
bousiya03 | 0:fbf5705f90cc | 60 | uint8_t k = __serial__.getc(); |
bousiya03 | 0:fbf5705f90cc | 61 | |
bousiya03 | 0:fbf5705f90cc | 62 | } |
bousiya03 | 0:fbf5705f90cc | 63 | |
bousiya03 | 0:fbf5705f90cc | 64 | void serial_extend::stop_read(){ |
bousiya03 | 0:fbf5705f90cc | 65 | |
bousiya03 | 0:fbf5705f90cc | 66 | __stop_read = 1; |
bousiya03 | 0:fbf5705f90cc | 67 | |
bousiya03 | 0:fbf5705f90cc | 68 | } |
bousiya03 | 0:fbf5705f90cc | 69 | |
bousiya03 | 0:fbf5705f90cc | 70 | void serial_extend::read_data(uint8_t* readData,uint8_t readKey){ |
bousiya03 | 0:fbf5705f90cc | 71 | |
bousiya03 | 0:fbf5705f90cc | 72 | __readData = readData; |
bousiya03 | 0:fbf5705f90cc | 73 | __readSize = __SIZE(__readData); |
bousiya03 | 0:fbf5705f90cc | 74 | __readKey = readKey; |
bousiya03 | 0:fbf5705f90cc | 75 | } |
bousiya03 | 0:fbf5705f90cc | 76 | |
bousiya03 | 0:fbf5705f90cc | 77 | |
bousiya03 | 0:fbf5705f90cc | 78 | void serial_extend::write_data(uint8_t* writeData,uint8_t writeKey){ |
bousiya03 | 0:fbf5705f90cc | 79 | |
bousiya03 | 0:fbf5705f90cc | 80 | __writeData=writeData; |
bousiya03 | 0:fbf5705f90cc | 81 | __writeSize = __SIZE(__writeData); |
bousiya03 | 0:fbf5705f90cc | 82 | __writeKey = writeKey; |
bousiya03 | 0:fbf5705f90cc | 83 | } |
bousiya03 | 0:fbf5705f90cc | 84 | |
bousiya03 | 0:fbf5705f90cc | 85 | |
bousiya03 | 1:e808dd01f134 | 86 | void serial_extend::TX(void){ |
bousiya03 | 0:fbf5705f90cc | 87 | |
bousiya03 | 0:fbf5705f90cc | 88 | if(__stop_write==1){return;} |
bousiya03 | 0:fbf5705f90cc | 89 | |
bousiya03 | 0:fbf5705f90cc | 90 | static uint8_t tx=__writeSize+2, i; |
bousiya03 | 0:fbf5705f90cc | 91 | static uint8_t txData[MAX_DATA_NUM]={__writeKey}; |
bousiya03 | 0:fbf5705f90cc | 92 | static uint8_t tx_checkcode=0; |
bousiya03 | 0:fbf5705f90cc | 93 | if(tx >= __writeSize+2){ |
bousiya03 | 0:fbf5705f90cc | 94 | txData[KEY] = __writeKey; |
bousiya03 | 0:fbf5705f90cc | 95 | |
bousiya03 | 0:fbf5705f90cc | 96 | for(int k=1;k<=__writeSize;k++){ |
bousiya03 | 0:fbf5705f90cc | 97 | txData[k] = __writeData[k-1]; |
bousiya03 | 0:fbf5705f90cc | 98 | } |
bousiya03 | 0:fbf5705f90cc | 99 | |
bousiya03 | 1:e808dd01f134 | 100 | |
bousiya03 | 0:fbf5705f90cc | 101 | for(i=KEY+1, tx_checkcode=0; i<__writeSize+1; i++){ |
bousiya03 | 0:fbf5705f90cc | 102 | tx_checkcode ^= txData[i]; |
bousiya03 | 1:e808dd01f134 | 103 | } //CHECKCODE |
bousiya03 | 0:fbf5705f90cc | 104 | txData[__writeSize+1] = tx_checkcode; |
bousiya03 | 0:fbf5705f90cc | 105 | tx=0; |
bousiya03 | 0:fbf5705f90cc | 106 | } |
bousiya03 | 0:fbf5705f90cc | 107 | __serial__.putc(txData[tx]); |
bousiya03 | 0:fbf5705f90cc | 108 | tx++; |
bousiya03 | 1:e808dd01f134 | 109 | } |
bousiya03 | 0:fbf5705f90cc | 110 | |
bousiya03 | 0:fbf5705f90cc | 111 | void serial_extend::RX(void){ |
bousiya03 | 0:fbf5705f90cc | 112 | |
bousiya03 | 0:fbf5705f90cc | 113 | if(__stop_read==1){return;} |
bousiya03 | 0:fbf5705f90cc | 114 | |
bousiya03 | 0:fbf5705f90cc | 115 | static uint8_t rx=0, i; |
bousiya03 | 0:fbf5705f90cc | 116 | static uint8_t rxData[MAX_DATA_NUM]={__readKey}; |
bousiya03 | 0:fbf5705f90cc | 117 | static uint8_t rx_checkcode=0; |
bousiya03 | 0:fbf5705f90cc | 118 | |
bousiya03 | 0:fbf5705f90cc | 119 | rxData[rx] = __serial__.getc(); |
bousiya03 | 0:fbf5705f90cc | 120 | |
bousiya03 | 0:fbf5705f90cc | 121 | if(rxData[KEY]==__readKey){ |
bousiya03 | 0:fbf5705f90cc | 122 | rx++; |
bousiya03 | 0:fbf5705f90cc | 123 | } |
bousiya03 | 0:fbf5705f90cc | 124 | |
bousiya03 | 0:fbf5705f90cc | 125 | if(rx==__readSize+1){ |
bousiya03 | 0:fbf5705f90cc | 126 | for(i=KEY+1, rx_checkcode=0; i<__readSize+1; i++){ |
bousiya03 | 0:fbf5705f90cc | 127 | rx_checkcode ^= rxData[i]; |
bousiya03 | 1:e808dd01f134 | 128 | } //CHECKCODE |
bousiya03 | 0:fbf5705f90cc | 129 | } |
bousiya03 | 0:fbf5705f90cc | 130 | |
bousiya03 | 0:fbf5705f90cc | 131 | if(rx >= __readSize+2){ |
bousiya03 | 0:fbf5705f90cc | 132 | if(rxData[__readSize+1]==rx_checkcode){ |
bousiya03 | 0:fbf5705f90cc | 133 | |
bousiya03 | 0:fbf5705f90cc | 134 | for(int m=1;m<=__readSize;m++){ |
bousiya03 | 0:fbf5705f90cc | 135 | __readData[m-1] = rxData[m]; |
bousiya03 | 0:fbf5705f90cc | 136 | } |
bousiya03 | 0:fbf5705f90cc | 137 | |
bousiya03 | 1:e808dd01f134 | 138 | |
bousiya03 | 0:fbf5705f90cc | 139 | } |
bousiya03 | 0:fbf5705f90cc | 140 | rx=0; |
bousiya03 | 0:fbf5705f90cc | 141 | } |
bousiya03 | 0:fbf5705f90cc | 142 | } |
bousiya03 | 0:fbf5705f90cc | 143 | |
bousiya03 | 0:fbf5705f90cc | 144 | uint8_t serial_extend::readable_check(){ |
bousiya03 | 0:fbf5705f90cc | 145 | |
bousiya03 | 0:fbf5705f90cc | 146 | return __serial__.readable(); |
bousiya03 | 0:fbf5705f90cc | 147 | |
bousiya03 | 0:fbf5705f90cc | 148 | } |