SONY製のNFCカードリーダ RC-S620/S をイニシエータとして使用し、NFC Type-A/Bと通信するライブラリです。FeliCaとは通信できません。(This library can't communicate with FeliCa! Only for NFC Type-A/B.)

Dependents:   DLC_STARTER

Committer:
hmizuno
Date:
Fri May 29 09:12:00 2020 +0000
Revision:
0:16a4197a4dfb
Child:
1:98c4a45b646a
first release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hmizuno 0:16a4197a4dfb 1 #include "mbed.h"
hmizuno 0:16a4197a4dfb 2 #include "RCS620S_AB.h"
hmizuno 0:16a4197a4dfb 3
hmizuno 0:16a4197a4dfb 4 //public function
hmizuno 0:16a4197a4dfb 5
hmizuno 0:16a4197a4dfb 6 //rc-s620 デフォルトボーレート;115200
hmizuno 0:16a4197a4dfb 7 RCS620S_AB::RCS620S_AB(PinName tx, PinName rx):
hmizuno 0:16a4197a4dfb 8 _serial(tx, rx, 115200){
hmizuno 0:16a4197a4dfb 9 initialize();
hmizuno 0:16a4197a4dfb 10 };
hmizuno 0:16a4197a4dfb 11
hmizuno 0:16a4197a4dfb 12 /***************/
hmizuno 0:16a4197a4dfb 13 /**** 制御系 ****/
hmizuno 0:16a4197a4dfb 14 /***************/
hmizuno 0:16a4197a4dfb 15
hmizuno 0:16a4197a4dfb 16 void RCS620S_AB::powerDown(){
hmizuno 0:16a4197a4dfb 17 sendCommand_and_RecieveRes(wired_data_RFConfiguration_PowerDown,(uint16_t)sizeof(wired_data_RFConfiguration_PowerDown));
hmizuno 0:16a4197a4dfb 18 }
hmizuno 0:16a4197a4dfb 19
hmizuno 0:16a4197a4dfb 20 void RCS620S_AB::wakeUp(){
hmizuno 0:16a4197a4dfb 21 _serial.putc(0x55);
hmizuno 0:16a4197a4dfb 22 wait_ms(50);
hmizuno 0:16a4197a4dfb 23 }
hmizuno 0:16a4197a4dfb 24
hmizuno 0:16a4197a4dfb 25 void RCS620S_AB::reset(){
hmizuno 0:16a4197a4dfb 26 //”カードを”リセットするためにRFをOFF
hmizuno 0:16a4197a4dfb 27 sendCommand_and_RecieveRes(wired_data_RFConfiguration_RFoff,(uint16_t)sizeof(wired_data_RFConfiguration_RFoff));
hmizuno 0:16a4197a4dfb 28 wait_ms(50);
hmizuno 0:16a4197a4dfb 29 sendCommand_and_RecieveRes(wired_data_Reset,(uint16_t)sizeof(wired_data_Reset));
hmizuno 0:16a4197a4dfb 30 }
hmizuno 0:16a4197a4dfb 31
hmizuno 0:16a4197a4dfb 32 /***************/
hmizuno 0:16a4197a4dfb 33 /**** 受信系 ****/
hmizuno 0:16a4197a4dfb 34 /***************/
hmizuno 0:16a4197a4dfb 35 /*受信バッファ配列 要素番号カンペ (ATQB受信例)
hmizuno 0:16a4197a4dfb 36
hmizuno 0:16a4197a4dfb 37 [11]D5 [12]4B [13]Tg [14~][CardRes] DCS
hmizuno 0:16a4197a4dfb 38
hmizuno 0:16a4197a4dfb 39 [ 0] 00 [ 1] 00 [ 2] FF [ 3] 00 [ 4] FF [ 5] 00 ~ACK
hmizuno 0:16a4197a4dfb 40 [ 6] 00 [ 7] 00 [ 8] FF [ 9] 12 [10] EE ~LCS
hmizuno 0:16a4197a4dfb 41 [11] D5 [12] 4B [13] 01 [14] 01 [15] 50 ・・・ [LEN-2] DCS [LEN-1] 00
hmizuno 0:16a4197a4dfb 42 ・全部ほしい場合:[0] ~ [LEN-1]
hmizuno 0:16a4197a4dfb 43 ・レスポンス部が欲しい場合:[11] ~ [LEN-3]
hmizuno 0:16a4197a4dfb 44 ・カードのデータ部が欲しい場合:[14] ~ [LEN-3]
hmizuno 0:16a4197a4dfb 45 */
hmizuno 0:16a4197a4dfb 46
hmizuno 0:16a4197a4dfb 47 //重要!配列要素集は0始まりのためLENと1ずれる!
hmizuno 0:16a4197a4dfb 48
hmizuno 0:16a4197a4dfb 49 //※デバッグ用 受信バッファーのデータを全て取得(ACKやチェックサム含むすべてのデータ)
hmizuno 0:16a4197a4dfb 50 void RCS620S_AB::getAllRes(uint8_t ansArray[], int *ansLen){
hmizuno 0:16a4197a4dfb 51 extractRes(0, recieveLEN-1 , ansArray, ansLen);
hmizuno 0:16a4197a4dfb 52 }
hmizuno 0:16a4197a4dfb 53
hmizuno 0:16a4197a4dfb 54 //ACKやチェックサムを除いたレスポンスを取得
hmizuno 0:16a4197a4dfb 55 void RCS620S_AB::getRes(uint8_t ansArray[], int *ansLen){
hmizuno 0:16a4197a4dfb 56 uint8_t dataLen = checkRxData_and_getLEN();
hmizuno 0:16a4197a4dfb 57 if(dataLen > 0){
hmizuno 0:16a4197a4dfb 58 extractRes(11, 11+dataLen-3 , ansArray, ansLen);
hmizuno 0:16a4197a4dfb 59 }else{
hmizuno 0:16a4197a4dfb 60 ansArray[0] = 0x00;
hmizuno 0:16a4197a4dfb 61 *ansLen = 0;
hmizuno 0:16a4197a4dfb 62 }
hmizuno 0:16a4197a4dfb 63 }
hmizuno 0:16a4197a4dfb 64
hmizuno 0:16a4197a4dfb 65 //inListPasseveTarget 及び inDataExchangeからカード情報だけを取得
hmizuno 0:16a4197a4dfb 66 void RCS620S_AB::getCardRes(uint8_t ansArray[], int *ansLen){
hmizuno 0:16a4197a4dfb 67
hmizuno 0:16a4197a4dfb 68 //inListPassiveTargetの場合 [11]D5 [12]4B [13]Tg [14~][CardRes] DCS
hmizuno 0:16a4197a4dfb 69 //inDataExchangeの場合 [11]D5 [12]41 [13]Status [14~][CardRes] DCS
hmizuno 0:16a4197a4dfb 70 //⇒共用可能
hmizuno 0:16a4197a4dfb 71
hmizuno 0:16a4197a4dfb 72 if(checkCardRes()){
hmizuno 0:16a4197a4dfb 73 extractRes(14, recieveLEN-3 , ansArray, ansLen);
hmizuno 0:16a4197a4dfb 74 }else{
hmizuno 0:16a4197a4dfb 75 ansArray[0] = 0x00;
hmizuno 0:16a4197a4dfb 76 *ansLen = 0;
hmizuno 0:16a4197a4dfb 77 }
hmizuno 0:16a4197a4dfb 78 }
hmizuno 0:16a4197a4dfb 79
hmizuno 0:16a4197a4dfb 80 /***************/
hmizuno 0:16a4197a4dfb 81 /**** 送信系 ****/
hmizuno 0:16a4197a4dfb 82 /***************/
hmizuno 0:16a4197a4dfb 83
hmizuno 0:16a4197a4dfb 84 //ICカードのコマンドのデータパケット部を受け取り、チェックサムなどの付加情報を付与し送信
hmizuno 0:16a4197a4dfb 85 void RCS620S_AB::sendCommand_and_RecieveRes(const uint8_t wired_packet_data[], uint16_t wired_packet_data_len){
hmizuno 0:16a4197a4dfb 86
hmizuno 0:16a4197a4dfb 87 //長すぎたらエラー
hmizuno 0:16a4197a4dfb 88 if(wired_packet_data_len > 252){
hmizuno 0:16a4197a4dfb 89 exit(1);
hmizuno 0:16a4197a4dfb 90 }
hmizuno 0:16a4197a4dfb 91
hmizuno 0:16a4197a4dfb 92 //0xD4で始まらなかったらエラー
hmizuno 0:16a4197a4dfb 93 if(wired_packet_data[0] != 0xD4){
hmizuno 0:16a4197a4dfb 94 exit(1);
hmizuno 0:16a4197a4dfb 95 }
hmizuno 0:16a4197a4dfb 96
hmizuno 0:16a4197a4dfb 97 //送信コマンド = 0x00 0x00 0xff LEN LCS [DATA PACKET] DCS 0x00
hmizuno 0:16a4197a4dfb 98
hmizuno 0:16a4197a4dfb 99 uint8_t *packet_data_command;
hmizuno 0:16a4197a4dfb 100 uint8_t LEN, LCS, DCS = 0x00;
hmizuno 0:16a4197a4dfb 101 uint32_t data_sum = 0x00000000;
hmizuno 0:16a4197a4dfb 102
hmizuno 0:16a4197a4dfb 103 int i = 0;
hmizuno 0:16a4197a4dfb 104
hmizuno 0:16a4197a4dfb 105 //LEN・LCSを計算
hmizuno 0:16a4197a4dfb 106 LEN = (uint8_t)(wired_packet_data_len); //送信データの長さ
hmizuno 0:16a4197a4dfb 107 LCS = (uint8_t)(0x0100 - LEN);
hmizuno 0:16a4197a4dfb 108
hmizuno 0:16a4197a4dfb 109 //card_command+リーダライタコマンド分のメモリを確保
hmizuno 0:16a4197a4dfb 110
hmizuno 0:16a4197a4dfb 111 packet_data_command = (uint8_t*)malloc(sizeof(uint8_t) * (LEN + 7));
hmizuno 0:16a4197a4dfb 112
hmizuno 0:16a4197a4dfb 113
hmizuno 0:16a4197a4dfb 114 //カードリーダのコマンドを送信データに結合
hmizuno 0:16a4197a4dfb 115
hmizuno 0:16a4197a4dfb 116 packet_data_command[0] = 0x00; //Preamble
hmizuno 0:16a4197a4dfb 117 packet_data_command[1] = 0x00; //Start Of Packet_1
hmizuno 0:16a4197a4dfb 118 packet_data_command[2] = 0xff; //Start Of Packet_2
hmizuno 0:16a4197a4dfb 119
hmizuno 0:16a4197a4dfb 120 packet_data_command[3] = LEN; //LEN
hmizuno 0:16a4197a4dfb 121 packet_data_command[4] = LCS; //LCS
hmizuno 0:16a4197a4dfb 122
hmizuno 0:16a4197a4dfb 123 //パケットデータを流し込む
hmizuno 0:16a4197a4dfb 124 for(i = 0; i < LEN; i++){
hmizuno 0:16a4197a4dfb 125 packet_data_command[i + 5] = wired_packet_data[i]; //DATA
hmizuno 0:16a4197a4dfb 126 data_sum = data_sum + wired_packet_data[i]; //DCS計算用
hmizuno 0:16a4197a4dfb 127 }
hmizuno 0:16a4197a4dfb 128
hmizuno 0:16a4197a4dfb 129 //DCSを計算
hmizuno 0:16a4197a4dfb 130 DCS = (uint8_t)(0x100 - (data_sum % 0x100));
hmizuno 0:16a4197a4dfb 131
hmizuno 0:16a4197a4dfb 132 packet_data_command[5 + LEN] = DCS; //DCS
hmizuno 0:16a4197a4dfb 133 packet_data_command[5 + LEN + 1] = 0x00; //Postamble
hmizuno 0:16a4197a4dfb 134
hmizuno 0:16a4197a4dfb 135 //レスポンスバッファをクリア
hmizuno 0:16a4197a4dfb 136 clearRecieveBuffer();
hmizuno 0:16a4197a4dfb 137
hmizuno 0:16a4197a4dfb 138 //コマンドを送信
hmizuno 0:16a4197a4dfb 139 for(i = 0; i <= (5 + LEN + 1); i++){
hmizuno 0:16a4197a4dfb 140 _serial.putc(packet_data_command[i]);
hmizuno 0:16a4197a4dfb 141 }
hmizuno 0:16a4197a4dfb 142
hmizuno 0:16a4197a4dfb 143 //powerdownの時はレスポンスが返ってこないので受信待機が無限ループに入ってしまう
hmizuno 0:16a4197a4dfb 144 //powerdown時はACKのみチェックする
hmizuno 0:16a4197a4dfb 145 //コマンドリファレンス39ページ『ただしACKは返します』
hmizuno 0:16a4197a4dfb 146 if(wired_packet_data[1] != wired_data_RFConfiguration_PowerDown[1]){
hmizuno 0:16a4197a4dfb 147 //レスポンス受信完了まで待機
hmizuno 0:16a4197a4dfb 148 waitWhileRead(5);
hmizuno 0:16a4197a4dfb 149 }else{
hmizuno 0:16a4197a4dfb 150 do{
hmizuno 0:16a4197a4dfb 151 wait_ms(1);
hmizuno 0:16a4197a4dfb 152 }while(recieveLEN <= sizeof(wired_complete_ACK));
hmizuno 0:16a4197a4dfb 153 }
hmizuno 0:16a4197a4dfb 154
hmizuno 0:16a4197a4dfb 155 //メモリをfree
hmizuno 0:16a4197a4dfb 156 free(packet_data_command);
hmizuno 0:16a4197a4dfb 157 }
hmizuno 0:16a4197a4dfb 158
hmizuno 0:16a4197a4dfb 159
hmizuno 0:16a4197a4dfb 160 //ICカードのコマンドを、リーダライタのInDataExchangeを使ってICカードへ送信する関数
hmizuno 0:16a4197a4dfb 161 void RCS620S_AB::sendInDataExchange_and_RecieveRes(const uint8_t card_command[], uint16_t card_command_len){
hmizuno 0:16a4197a4dfb 162
hmizuno 0:16a4197a4dfb 163 //card_command+リーダライタコマンド分のメモリを確保
hmizuno 0:16a4197a4dfb 164 uint8_t *packet_command;
hmizuno 0:16a4197a4dfb 165 packet_command = (uint8_t*)malloc(sizeof(uint8_t) * (card_command_len + 3));
hmizuno 0:16a4197a4dfb 166
hmizuno 0:16a4197a4dfb 167 //無線コマンドの前にInDataExchange有線コマンド結合
hmizuno 0:16a4197a4dfb 168 packet_command[0] = 0xD4; //コマンドコード
hmizuno 0:16a4197a4dfb 169 packet_command[1] = 0x40; //サブコマンドコード
hmizuno 0:16a4197a4dfb 170 packet_command[2] = 0x01; //Tg(InListPassiveTargetであらかじめ1枚に指定)
hmizuno 0:16a4197a4dfb 171
hmizuno 0:16a4197a4dfb 172 for(int i = 0; i < card_command_len ; i++){
hmizuno 0:16a4197a4dfb 173 packet_command[i + 3] = card_command[i];
hmizuno 0:16a4197a4dfb 174 }
hmizuno 0:16a4197a4dfb 175
hmizuno 0:16a4197a4dfb 176 //カードリーダへ送信
hmizuno 0:16a4197a4dfb 177 sendCommand_and_RecieveRes(packet_command, (card_command_len + 3));
hmizuno 0:16a4197a4dfb 178
hmizuno 0:16a4197a4dfb 179 //メモリをfree
hmizuno 0:16a4197a4dfb 180 free(packet_command);
hmizuno 0:16a4197a4dfb 181 }
hmizuno 0:16a4197a4dfb 182
hmizuno 0:16a4197a4dfb 183
hmizuno 0:16a4197a4dfb 184 void RCS620S_AB::sendInListPasseveTarget_typeA(){
hmizuno 0:16a4197a4dfb 185 sendCommand_and_RecieveRes(wired_data_InListPassiveTarget_typeA,(uint16_t)sizeof(wired_data_InListPassiveTarget_typeA));
hmizuno 0:16a4197a4dfb 186 }
hmizuno 0:16a4197a4dfb 187
hmizuno 0:16a4197a4dfb 188 void RCS620S_AB::sendInListPassiveTarget_typeB(){
hmizuno 0:16a4197a4dfb 189 sendCommand_and_RecieveRes(wired_data_InListPassiveTarget_typeB,(uint16_t)sizeof(wired_data_InListPassiveTarget_typeB));
hmizuno 0:16a4197a4dfb 190 }
hmizuno 0:16a4197a4dfb 191
hmizuno 0:16a4197a4dfb 192 //private functioin
hmizuno 0:16a4197a4dfb 193
hmizuno 0:16a4197a4dfb 194 /***************/
hmizuno 0:16a4197a4dfb 195 /**** 制御系 ****/
hmizuno 0:16a4197a4dfb 196 /***************/
hmizuno 0:16a4197a4dfb 197
hmizuno 0:16a4197a4dfb 198 void RCS620S_AB::initialize(){
hmizuno 0:16a4197a4dfb 199 //UART受信割り込み設定
hmizuno 0:16a4197a4dfb 200 _serial.attach(callback(this,&RCS620S_AB::serialRxIrq), Serial::RxIrq);
hmizuno 0:16a4197a4dfb 201 sendCommand_and_RecieveRes(wired_data_AdditionalTime24ms,(uint16_t)sizeof(wired_data_AdditionalTime24ms));
hmizuno 0:16a4197a4dfb 202 }
hmizuno 0:16a4197a4dfb 203
hmizuno 0:16a4197a4dfb 204 /***************/
hmizuno 0:16a4197a4dfb 205 /**** 受信系 ****/
hmizuno 0:16a4197a4dfb 206 /***************/
hmizuno 0:16a4197a4dfb 207
hmizuno 0:16a4197a4dfb 208 //カードリーダ UART受信割込み
hmizuno 0:16a4197a4dfb 209 //※この関数のなかでデバッグ用printf使用不可(処理中に取りこぼす)
hmizuno 0:16a4197a4dfb 210 void RCS620S_AB::serialRxIrq(){
hmizuno 0:16a4197a4dfb 211 recieveBuffer[recieveLEN] = (uint8_t)_serial.getc(); //0
hmizuno 0:16a4197a4dfb 212 recieveLEN++; //1 LEN = 配列番号+1 になりOK
hmizuno 0:16a4197a4dfb 213 if(recieveLEN >= READ_BUF_SIZE){
hmizuno 0:16a4197a4dfb 214 exit(1);
hmizuno 0:16a4197a4dfb 215 }
hmizuno 0:16a4197a4dfb 216 }
hmizuno 0:16a4197a4dfb 217
hmizuno 0:16a4197a4dfb 218 void RCS620S_AB::clearRecieveBuffer(){
hmizuno 0:16a4197a4dfb 219 //受信バッファカーソル位置を先頭に
hmizuno 0:16a4197a4dfb 220 recieveLEN = 0;
hmizuno 0:16a4197a4dfb 221
hmizuno 0:16a4197a4dfb 222 //受信バッファをクリア
hmizuno 0:16a4197a4dfb 223 for(int i = 0; i < READ_BUF_SIZE; i++){
hmizuno 0:16a4197a4dfb 224 recieveBuffer[i] = 0x00;
hmizuno 0:16a4197a4dfb 225 }
hmizuno 0:16a4197a4dfb 226 }
hmizuno 0:16a4197a4dfb 227
hmizuno 0:16a4197a4dfb 228 //読み取り完了まで待機
hmizuno 0:16a4197a4dfb 229 //ACK受信後、一定時間経過しても受信文字数が増えなくなる(=RX割り込みがかからない=受信完了)まで待機
hmizuno 0:16a4197a4dfb 230 void RCS620S_AB::waitWhileRead(int cycleTime_ms){
hmizuno 0:16a4197a4dfb 231
hmizuno 0:16a4197a4dfb 232 int cTime;
hmizuno 0:16a4197a4dfb 233 if(cycleTime_ms >= 1){
hmizuno 0:16a4197a4dfb 234 cTime = cycleTime_ms;
hmizuno 0:16a4197a4dfb 235 }else{
hmizuno 0:16a4197a4dfb 236 cTime = 1;
hmizuno 0:16a4197a4dfb 237 }
hmizuno 0:16a4197a4dfb 238
hmizuno 0:16a4197a4dfb 239 //ackはmax3.5ms
hmizuno 0:16a4197a4dfb 240 int l;
hmizuno 0:16a4197a4dfb 241 do{
hmizuno 0:16a4197a4dfb 242 l = recieveLEN; //現在の受信文字数
hmizuno 0:16a4197a4dfb 243 wait_ms(cTime);
hmizuno 0:16a4197a4dfb 244 }while(recieveLEN <= sizeof(wired_complete_ACK) || l < recieveLEN);//一定時間後の受信文字数と比較
hmizuno 0:16a4197a4dfb 245 }
hmizuno 0:16a4197a4dfb 246
hmizuno 0:16a4197a4dfb 247 //受信バッファからrecieveBuffer[start] ~ recieveBuffer[end] を抜き出す
hmizuno 0:16a4197a4dfb 248 void RCS620S_AB::extractRes(int start, int end, uint8_t ansArray[], int *ansLen){
hmizuno 0:16a4197a4dfb 249 if(end > recieveLEN || start > end){
hmizuno 0:16a4197a4dfb 250 *ansLen = 0;
hmizuno 0:16a4197a4dfb 251 }else{
hmizuno 0:16a4197a4dfb 252 int j = 0;
hmizuno 0:16a4197a4dfb 253 for(int i = start; i <= end; i++){
hmizuno 0:16a4197a4dfb 254 ansArray[j] = recieveBuffer[i];
hmizuno 0:16a4197a4dfb 255 j++;
hmizuno 0:16a4197a4dfb 256 }
hmizuno 0:16a4197a4dfb 257 *ansLen = end - start + 1;
hmizuno 0:16a4197a4dfb 258 }
hmizuno 0:16a4197a4dfb 259 }
hmizuno 0:16a4197a4dfb 260
hmizuno 0:16a4197a4dfb 261 /***************/
hmizuno 0:16a4197a4dfb 262 /**** 検査系 ****/
hmizuno 0:16a4197a4dfb 263 /***************/
hmizuno 0:16a4197a4dfb 264
hmizuno 0:16a4197a4dfb 265 //頭についているACKが仕様書記載通りのデータになっているか確認
hmizuno 0:16a4197a4dfb 266 bool RCS620S_AB::checkACK(){
hmizuno 0:16a4197a4dfb 267 bool flag = true;
hmizuno 0:16a4197a4dfb 268 for(int i = 0; i<sizeof(wired_complete_ACK); i++){
hmizuno 0:16a4197a4dfb 269 if(wired_complete_ACK[i] != recieveBuffer[i]){
hmizuno 0:16a4197a4dfb 270 flag = false;
hmizuno 0:16a4197a4dfb 271 }
hmizuno 0:16a4197a4dfb 272 }
hmizuno 0:16a4197a4dfb 273 return flag;
hmizuno 0:16a4197a4dfb 274 }
hmizuno 0:16a4197a4dfb 275
hmizuno 0:16a4197a4dfb 276
hmizuno 0:16a4197a4dfb 277 bool RCS620S_AB::checkCardRes(){
hmizuno 0:16a4197a4dfb 278 //inListPassiveTargetの場合 D5 4B Tg [CardRes] DCS
hmizuno 0:16a4197a4dfb 279 //inDataExchangeの場合 D5 41 Status [CardRes] DCS
hmizuno 0:16a4197a4dfb 280
hmizuno 0:16a4197a4dfb 281 //そもそも受信できてなければエラー
hmizuno 0:16a4197a4dfb 282 if(checkRxData_and_getLEN() < 1){
hmizuno 0:16a4197a4dfb 283 return false;
hmizuno 0:16a4197a4dfb 284 }
hmizuno 0:16a4197a4dfb 285
hmizuno 0:16a4197a4dfb 286 //使う頻度が多いinDataExchangeを先に評価
hmizuno 0:16a4197a4dfb 287 if(recieveBuffer[12] == 0x41 && recieveBuffer[13] == 0x00){
hmizuno 0:16a4197a4dfb 288 //inListpassiveTargetレスポンス(0x41)ならばターゲットidが0x01かチェック
hmizuno 0:16a4197a4dfb 289 return true;
hmizuno 0:16a4197a4dfb 290 }else if(recieveBuffer[12] == 0x4B && recieveBuffer[13] == 0x01){
hmizuno 0:16a4197a4dfb 291 //inListpassiveTargetレスポンス(0x4B)ならばターゲットidが0x01かチェック
hmizuno 0:16a4197a4dfb 292 return true;
hmizuno 0:16a4197a4dfb 293 }else{
hmizuno 0:16a4197a4dfb 294 return false;
hmizuno 0:16a4197a4dfb 295 }
hmizuno 0:16a4197a4dfb 296 }
hmizuno 0:16a4197a4dfb 297
hmizuno 0:16a4197a4dfb 298
hmizuno 0:16a4197a4dfb 299 //受信データをチェックしてOKならLENを返す、異常なら0を返す
hmizuno 0:16a4197a4dfb 300 uint8_t RCS620S_AB::checkRxData_and_getLEN(){
hmizuno 0:16a4197a4dfb 301
hmizuno 0:16a4197a4dfb 302 //頭にACKが付いているかチェック
hmizuno 0:16a4197a4dfb 303 if(!checkACK()){
hmizuno 0:16a4197a4dfb 304 return 0;
hmizuno 0:16a4197a4dfb 305 }
hmizuno 0:16a4197a4dfb 306
hmizuno 0:16a4197a4dfb 307 //LEN+LCSをチェックしてLENを取得
hmizuno 0:16a4197a4dfb 308 uint8_t data_len = 0;
hmizuno 0:16a4197a4dfb 309
hmizuno 0:16a4197a4dfb 310 uint8_t recieved_LEN_check = (uint8_t)(0x00ff & (recieveBuffer[9]+recieveBuffer[10]));
hmizuno 0:16a4197a4dfb 311 if(recieved_LEN_check == 0x00 && recieveBuffer[9] > 0x00){
hmizuno 0:16a4197a4dfb 312 data_len = recieveBuffer[9];
hmizuno 0:16a4197a4dfb 313 }else{
hmizuno 0:16a4197a4dfb 314 //LEN受信エラー
hmizuno 0:16a4197a4dfb 315 return 0;
hmizuno 0:16a4197a4dfb 316 }
hmizuno 0:16a4197a4dfb 317
hmizuno 0:16a4197a4dfb 318 //レスポンスコードをチェック
hmizuno 0:16a4197a4dfb 319 if(recieveBuffer[11] != 0xD5){
hmizuno 0:16a4197a4dfb 320 //レスポンスコードが 0xD5 でない
hmizuno 0:16a4197a4dfb 321 return 0;
hmizuno 0:16a4197a4dfb 322 }
hmizuno 0:16a4197a4dfb 323
hmizuno 0:16a4197a4dfb 324 //DCSをチェック
hmizuno 0:16a4197a4dfb 325 uint32_t data_sum = 0x00000000;
hmizuno 0:16a4197a4dfb 326 for(int i = 11; i < 11 + data_len; i++){
hmizuno 0:16a4197a4dfb 327 data_sum = data_sum + recieveBuffer[i];
hmizuno 0:16a4197a4dfb 328 }
hmizuno 0:16a4197a4dfb 329 data_sum = 0x000000FF & data_sum;
hmizuno 0:16a4197a4dfb 330 //データ合計にDCSを足す
hmizuno 0:16a4197a4dfb 331 data_sum = data_sum + recieveBuffer[11 + data_len];
hmizuno 0:16a4197a4dfb 332
hmizuno 0:16a4197a4dfb 333 if(data_sum == 0x100){
hmizuno 0:16a4197a4dfb 334 //LENを返す
hmizuno 0:16a4197a4dfb 335 return data_len;
hmizuno 0:16a4197a4dfb 336 }else{
hmizuno 0:16a4197a4dfb 337 //データ受信エラー
hmizuno 0:16a4197a4dfb 338 return 0;
hmizuno 0:16a4197a4dfb 339 }
hmizuno 0:16a4197a4dfb 340 }