自分用通信ライブラリ RS485で先頭識別子を使用した通信をするときに使う.

Dependencies:   BufferedSerial

Dependents:   FourOmniMecha

BufferdSerialを使用している.Arduinoライクに通信したいから

2020/3/6 GetBusSerial()にて先頭識別子付きの通信ができる.

2020/11/16 GetBusSerial()は廃止(使えるけれども).getBusSerialとかgetTimedBusSerialとかに変えた

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?

UserRevisionLine numberNew 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 }