自分用通信ライブラリ RS485で先頭識別子を使用した通信をするときに使う.
BufferdSerialを使用している.Arduinoライクに通信したいから
2020/3/6 GetBusSerial()にて先頭識別子付きの通信ができる.
2020/11/16 GetBusSerial()は廃止(使えるけれども).getBusSerialとかgetTimedBusSerialとかに変えた
BusSerial.cpp@6:496eaf58c584, 2020-11-13 (annotated)
- Committer:
- ttrist
- Date:
- Fri Nov 13 02:02:13 2020 +0000
- Revision:
- 6:496eaf58c584
- Parent:
- 4:3b347fa779b7
"int time_start" -> "uint32_t time_start"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ttrist | 0:418bb20836bd | 1 | #include "BusSerial.h" |
ttrist | 0:418bb20836bd | 2 | |
ttrist | 0:418bb20836bd | 3 | BusSerial::BusSerial(PinName tx, PinName rx,Timer *timer):BufferedSerial(tx,rx) |
ttrist | 0:418bb20836bd | 4 | { |
ttrist | 0:418bb20836bd | 5 | _timer = timer; |
ttrist | 0:418bb20836bd | 6 | _timer -> start(); |
ttrist | 0:418bb20836bd | 7 | } |
ttrist | 0:418bb20836bd | 8 | |
ttrist | 4:3b347fa779b7 | 9 | |
ttrist | 4:3b347fa779b7 | 10 | // ヘッダー照合のみの超単純な受信関数. |
ttrist | 4:3b347fa779b7 | 11 | // 引数は(格納先配列アドレス, ヘッダー番号, データ数) |
ttrist | 4:3b347fa779b7 | 12 | // データ数はヘッダーの後ろに続く使用するデータの個数. |
ttrist | 4:3b347fa779b7 | 13 | // ex)255 1 0 20 72 と送信されるなら 4(個)である. |
ttrist | 4:3b347fa779b7 | 14 | // この表現 vs 格納先配列の要素数 どちらが使いやすくなるのか?それによって今後変えるかも |
ttrist | 4:3b347fa779b7 | 15 | // 戻り値として,通信が正常にできたらtrueを返す. |
ttrist | 4:3b347fa779b7 | 16 | bool BusSerial::getBusSerial(uint8_t* container, uint8_t head_num, uint8_t data_quantity) |
ttrist | 4:3b347fa779b7 | 17 | { |
ttrist | 4:3b347fa779b7 | 18 | //格納先配列の初期化 |
ttrist | 4:3b347fa779b7 | 19 | for (uint8_t i = 0; i < data_quantity + 1; i++) container[i] = 0; |
ttrist | 4:3b347fa779b7 | 20 | |
ttrist | 4:3b347fa779b7 | 21 | // データ格納.ヘッダーがくるまで受信し続ける |
ttrist | 4:3b347fa779b7 | 22 | while (container[0] != head_num) |
ttrist | 4:3b347fa779b7 | 23 | if (readable() > 0) container[0] = getc(); |
ttrist | 4:3b347fa779b7 | 24 | |
ttrist | 4:3b347fa779b7 | 25 | // 通信の中身を受信 |
ttrist | 4:3b347fa779b7 | 26 | for (uint8_t i = 1; i < data_quantity + 1; i++) { |
ttrist | 4:3b347fa779b7 | 27 | if (readable() > 0) container[i] = getc(); |
ttrist | 4:3b347fa779b7 | 28 | else i--; // 受信できない状態なら次も同じiの値で処理 |
ttrist | 4:3b347fa779b7 | 29 | } |
ttrist | 4:3b347fa779b7 | 30 | |
ttrist | 4:3b347fa779b7 | 31 | // 受信バッファに溜まったデータをクリア.いらないかも. |
ttrist | 4:3b347fa779b7 | 32 | deleteBufferData(); |
ttrist | 4:3b347fa779b7 | 33 | |
ttrist | 4:3b347fa779b7 | 34 | // 受信データを正常に取得できたか? |
ttrist | 4:3b347fa779b7 | 35 | if(container[0] == head_num) return true; |
ttrist | 4:3b347fa779b7 | 36 | else return false; |
ttrist | 4:3b347fa779b7 | 37 | } |
ttrist | 4:3b347fa779b7 | 38 | |
ttrist | 4:3b347fa779b7 | 39 | |
ttrist | 4:3b347fa779b7 | 40 | // ヘッダー照合とタイムアウト処理できる受信関数. |
ttrist | 4:3b347fa779b7 | 41 | // 引数は(格納先配列アドレス, ヘッダー番号, データ数, タイムアウト時間ms) |
ttrist | 4:3b347fa779b7 | 42 | // タイムアウトはこの関数が呼ばれてから~ms後にfalseを返す |
ttrist | 4:3b347fa779b7 | 43 | bool BusSerial::getTimedBusSerial(uint8_t* container, uint8_t head_num, uint8_t data_quantity, int timeout) |
ttrist | 4:3b347fa779b7 | 44 | { |
ttrist | 4:3b347fa779b7 | 45 | // 受信開始時間記録 |
ttrist | 6:496eaf58c584 | 46 | uint32_t time_start = _timer->read_ms(); |
ttrist | 4:3b347fa779b7 | 47 | |
ttrist | 4:3b347fa779b7 | 48 | for (uint8_t i = 0; i < data_quantity + 1; i++) container[i] = 0; |
ttrist | 4:3b347fa779b7 | 49 | while (container[0] != head_num) { |
ttrist | 4:3b347fa779b7 | 50 | if (readable() > 0) container[0] = getc(); |
ttrist | 4:3b347fa779b7 | 51 | if (_timer->read_ms() - time_start > timeout) return false; |
ttrist | 4:3b347fa779b7 | 52 | } |
ttrist | 4:3b347fa779b7 | 53 | |
ttrist | 4:3b347fa779b7 | 54 | for (uint8_t i = 1; i < data_quantity + 1; i++) { |
ttrist | 4:3b347fa779b7 | 55 | if (readable() > 0) container[i] = getc(); |
ttrist | 4:3b347fa779b7 | 56 | else { |
ttrist | 4:3b347fa779b7 | 57 | i--; |
ttrist | 4:3b347fa779b7 | 58 | if (_timer->read_ms() - time_start > timeout) return false; |
ttrist | 4:3b347fa779b7 | 59 | } |
ttrist | 4:3b347fa779b7 | 60 | } |
ttrist | 4:3b347fa779b7 | 61 | |
ttrist | 4:3b347fa779b7 | 62 | deleteBufferData(); |
ttrist | 4:3b347fa779b7 | 63 | |
ttrist | 4:3b347fa779b7 | 64 | if(container[0] == head_num) return true; |
ttrist | 4:3b347fa779b7 | 65 | else return false; |
ttrist | 4:3b347fa779b7 | 66 | } |
ttrist | 4:3b347fa779b7 | 67 | |
ttrist | 4:3b347fa779b7 | 68 | |
ttrist | 4:3b347fa779b7 | 69 | // ヘッダーとフッター照合の受信関数. |
ttrist | 4:3b347fa779b7 | 70 | // 引数は(格納先配列アドレス, ヘッダー番号, データ数, フッター番号) |
ttrist | 4:3b347fa779b7 | 71 | bool BusSerial::getBusSerial(uint8_t* container, uint8_t head_num, uint8_t data_quantity, uint8_t footer_num) |
ttrist | 4:3b347fa779b7 | 72 | { |
ttrist | 4:3b347fa779b7 | 73 | // フッター分が追加されるため +2 となる. |
ttrist | 4:3b347fa779b7 | 74 | for (uint8_t i = 0; i < data_quantity + 2; i++) container[i] = 0; |
ttrist | 4:3b347fa779b7 | 75 | |
ttrist | 4:3b347fa779b7 | 76 | while (container[0] != head_num) |
ttrist | 4:3b347fa779b7 | 77 | if (readable() > 0) container[0] = getc(); |
ttrist | 4:3b347fa779b7 | 78 | for (uint8_t i = 1; i < data_quantity + 2; i++) { |
ttrist | 4:3b347fa779b7 | 79 | if (readable() > 0) container[i] = getc(); |
ttrist | 4:3b347fa779b7 | 80 | else i--; |
ttrist | 4:3b347fa779b7 | 81 | } |
ttrist | 4:3b347fa779b7 | 82 | |
ttrist | 4:3b347fa779b7 | 83 | if(container[0] == head_num && container[data_quantity + 1] == footer_num) return true; |
ttrist | 4:3b347fa779b7 | 84 | else return false; |
ttrist | 4:3b347fa779b7 | 85 | } |
ttrist | 4:3b347fa779b7 | 86 | |
ttrist | 4:3b347fa779b7 | 87 | |
ttrist | 4:3b347fa779b7 | 88 | // ヘッダーとフッター照合とタイムアウト処理できる受信関数. |
ttrist | 4:3b347fa779b7 | 89 | // 引数は(格納先配列アドレス, ヘッダー番号, データ数, フッター番号, タイムアウト時間ms) |
ttrist | 4:3b347fa779b7 | 90 | // タイムアウトはこの関数が呼ばれてから~ms後にfalseを返す |
ttrist | 4:3b347fa779b7 | 91 | bool BusSerial::getTimedBusSerial |
ttrist | 4:3b347fa779b7 | 92 | (uint8_t* container, uint8_t head_num, uint8_t data_quantity, uint8_t footer_num, int timeout) |
ttrist | 4:3b347fa779b7 | 93 | { |
ttrist | 6:496eaf58c584 | 94 | uint32_t time_start = _timer->read_ms(); |
ttrist | 4:3b347fa779b7 | 95 | |
ttrist | 4:3b347fa779b7 | 96 | for (uint8_t i = 0; i < data_quantity + 2; i++) container[i] = 0; |
ttrist | 4:3b347fa779b7 | 97 | while (container[0] != head_num) { |
ttrist | 4:3b347fa779b7 | 98 | if (readable() > 0) container[0] = getc(); |
ttrist | 4:3b347fa779b7 | 99 | if (_timer->read_ms() - time_start > timeout) return false; |
ttrist | 4:3b347fa779b7 | 100 | } |
ttrist | 4:3b347fa779b7 | 101 | |
ttrist | 4:3b347fa779b7 | 102 | for (uint8_t i = 1; i < data_quantity + 2; i++) { |
ttrist | 4:3b347fa779b7 | 103 | if (readable() > 0) container[i] = getc(); |
ttrist | 4:3b347fa779b7 | 104 | else { |
ttrist | 4:3b347fa779b7 | 105 | i--; |
ttrist | 4:3b347fa779b7 | 106 | if (_timer->read_ms() - time_start > timeout) return false; |
ttrist | 4:3b347fa779b7 | 107 | } |
ttrist | 4:3b347fa779b7 | 108 | } |
ttrist | 4:3b347fa779b7 | 109 | deleteBufferData(); |
ttrist | 4:3b347fa779b7 | 110 | if(container[0] == head_num && container[data_quantity + 1] == footer_num) return true; |
ttrist | 4:3b347fa779b7 | 111 | else return false; |
ttrist | 4:3b347fa779b7 | 112 | } |
ttrist | 4:3b347fa779b7 | 113 | |
ttrist | 4:3b347fa779b7 | 114 | |
ttrist | 4:3b347fa779b7 | 115 | // 配列のデータ送信. |
ttrist | 4:3b347fa779b7 | 116 | // 正直中身をそのまま書いた方が楽. |
ttrist | 4:3b347fa779b7 | 117 | void BusSerial::sendBusSerial(uint8_t *send_array, uint8_t size) |
ttrist | 4:3b347fa779b7 | 118 | { |
ttrist | 4:3b347fa779b7 | 119 | for(uint8_t i = 0; i<size; i++) putc(send_array[i]); |
ttrist | 4:3b347fa779b7 | 120 | } |
ttrist | 4:3b347fa779b7 | 121 | |
ttrist | 4:3b347fa779b7 | 122 | |
ttrist | 4:3b347fa779b7 | 123 | // バッファ中身を全部読んで消去する. |
ttrist | 4:3b347fa779b7 | 124 | void BusSerial::deleteBufferData() |
ttrist | 4:3b347fa779b7 | 125 | { |
ttrist | 4:3b347fa779b7 | 126 | while (readable() > 0) getc(); |
ttrist | 4:3b347fa779b7 | 127 | } |
ttrist | 4:3b347fa779b7 | 128 | |
ttrist | 4:3b347fa779b7 | 129 | |
ttrist | 4:3b347fa779b7 | 130 | // 旧式の通信関数.古いプロジェクト用に残す. |
ttrist | 0:418bb20836bd | 131 | void BusSerial::GetBusSerial(uint8_t *Argument_Array, int myHead_ID, int RecieveData_sizeof, int BusSerialTimeout) |
ttrist | 0:418bb20836bd | 132 | { |
ttrist | 0:418bb20836bd | 133 | long BusSerialTimeout_start_t = _timer->read_ms(); //タイマーセット |
ttrist | 0:418bb20836bd | 134 | for (int i = 0; i < RecieveData_sizeof; i++) *(Argument_Array + i) = 0; //データ初期化 |
ttrist | 0:418bb20836bd | 135 | |
ttrist | 0:418bb20836bd | 136 | //*** データ受信 ちゃんとなるまでループ(timeoutあり)*** |
ttrist | 0:418bb20836bd | 137 | while (*Argument_Array != myHead_ID) { |
ttrist | 0:418bb20836bd | 138 | //*** 1byte読み込み *** |
ttrist | 0:418bb20836bd | 139 | if (readable() > 0) *Argument_Array = getc(); |
ttrist | 0:418bb20836bd | 140 | |
ttrist | 0:418bb20836bd | 141 | if (*Argument_Array == myHead_ID ) { |
ttrist | 0:418bb20836bd | 142 | int old_i = 0; |
ttrist | 0:418bb20836bd | 143 | //*** データ格納エリア *** |
ttrist | 0:418bb20836bd | 144 | for (int i = 1; i < RecieveData_sizeof; i++) { |
ttrist | 0:418bb20836bd | 145 | //格納中のtimeout処理用時間設定 |
ttrist | 0:418bb20836bd | 146 | if (old_i != i) { |
ttrist | 0:418bb20836bd | 147 | old_i = i; |
ttrist | 0:418bb20836bd | 148 | BusSerialTimeout_start_t = _timer->read_ms(); //データ格納timeout用 |
ttrist | 0:418bb20836bd | 149 | } |
ttrist | 0:418bb20836bd | 150 | |
ttrist | 0:418bb20836bd | 151 | //***データ格納部*** |
ttrist | 0:418bb20836bd | 152 | if (readable() > 0) { |
ttrist | 0:418bb20836bd | 153 | *(Argument_Array + i) = getc(); |
ttrist | 0:418bb20836bd | 154 | } else { |
ttrist | 0:418bb20836bd | 155 | if (_timer->read_ms() - BusSerialTimeout_start_t > BusSerialTimeout) break; |
ttrist | 0:418bb20836bd | 156 | i--; |
ttrist | 0:418bb20836bd | 157 | } |
ttrist | 0:418bb20836bd | 158 | } |
ttrist | 0:418bb20836bd | 159 | } |
ttrist | 0:418bb20836bd | 160 | if (_timer->read_ms() - BusSerialTimeout_start_t > BusSerialTimeout) break;//timeout |
ttrist | 0:418bb20836bd | 161 | } |
ttrist | 2:6895c7ec9db1 | 162 | } |