前提・実現したいこと
PC(MFC)から送信される0x00~0xFFまでのバイナリデータをArduinoで正しく受信したいです。
発生している問題
送信するデータ内容によって、データが消失したか何かで無限ループから抜け出せなくなりました。
該当のソースコード
Arduino
1const int DataMax = 12; 2byte rxData[50][DataMax] = { 0 }; 3int rxCount = 0; 4 5const int Cpin = 7; 6const int Spin = 8; 7const int Upin = 9; 8 9void setup() 10{ 11 Serial.begin(9600); 12 pinMode(Cpin, OUTPUT); 13 pinMode(Spin, OUTPUT); 14 pinMode(Upin, OUTPUT); 15 digitalWrite(Cpin, HIGH); 16 digitalWrite(Spin, HIGH); 17 digitalWrite(Upin, HIGH); 18} 19 20void loop() 21{ 22 SerialRead(); 23} 24 25bool SerialRead() 26{ 27 int recv = 0; 28 bool result = false; 29 30 //シリアル受信判定 31 if(Serial.available() > 0) 32 { 33 recv = Serial.read(); //1byteずつ吐き出し 34 35 //ヘッダー分岐 36 switch(recv) 37 { 38 case 'C' : 39 { 40 Hedder_C(); 41 digitalWrite(Cpin, LOW); 42 setupData(); 43 digitalWrite(Spin, LOW); 44 result = true; 45 break; 46 } 47 case 'U' : 48 { 49 Hedder_U(); 50 digitalWrite(Upin, LOW); 51 result = true; 52 break; 53 } 54 default: 55 { 56 break; 57 } 58 } 59 } 60 61 return result; 62} 63 64void Hedder_C() 65{ 66 int recv = 0; 67 68 //データ数取得 69 while(1) 70 { 71 recv = Serial.read(); //1byteずつ吐き出し 72 if(recv != -1) 73 { 74 rxCount = recv; 75 rxCount++; 76 break; 77 } 78 } 79} 80 81void setupData() 82{ 83 int recv = 0; 84 85 for(int k = 0; k < rxCount; k++) 86 { 87 //ヘッダー取得 88 while(1) 89 { 90 recv = Serial.read(); //1byteずつ吐き出し 91 if(recv == 'S') 92 { 93 //データ本体取得 94 for(int j = 0; j < DataMax; j++) 95 { 96 while(1) 97 { 98 recv = Serial.read(); //1byteずつ吐き出し 99 if(recv != -1) 100 { 101 rxData[k][j] = (byte)recv; 102 break; 103 } 104 } 105 } 106 break; 107 } 108 } 109 } 110} 111 112void Hedder_U() 113{ 114 int recv = 0; 115 int pos = 0; 116 117 //データ位置取得 118 while(1) 119 { 120 recv = Serial.read(); //1byteずつ吐き出し 121 if(recv != -1) 122 { 123 pos = recv; 124 break; 125 } 126 } 127 128 //データ本体取得 129 for(int j = 0; j < DataMax; j++) 130 { 131 while(1) 132 { 133 recv = Serial.read(); //1byteずつ吐き出し 134 if(recv != -1) 135 { 136 rxData[pos][j] = (byte)recv; 137 break; 138 } 139 } 140 } 141}
受信するシリアルデータ
- 総データ数:0x43(ヘッダーC), 0x00(データ数-1)
- データ設定:0x53(ヘッダーS), 0x34, 0xB8, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00(データ12byte)
[受信できたデータ設定]
0x53, 0x34, 0xB8, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0x53, 0x34, 0xB8, 0x64, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0x53, 0x34, 0xB8, 0x64, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0x53, 0x34, 0xB8, 0x64, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
0x53, 0x34, 0xB8, 0x64, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00
[受信できないデータ設定]
0x53, 0x34, 0xB8, 0x64, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0x53, 0x34, 0xB8, 0x64, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
通信シーケンス
- 総データ数を受信する
- 受信した総データ数分だけデータ設定が来るので、それを配列に格納する
※記述はないがヘッダーUで特定のデータの中身を書き換える
試したこと
ボーレートを115200や9600を試してもダメでした。
追記
全ての組み合わせを確認できたわけではありませんが、メッセージの6(0開始)番目が0以外だと必ず発生しました。
回答2件
あなたの回答
tips
プレビュー