###前提・実現したいこと
Arduinoを複数用いて、シリアル通信をしています。ArduinoNANO側でRTCモジュールから時間情報を取得し、それをArduinoM0Proへ送信しています。
現状では、電源を二台同時に付けると、時間情報が正確に伝わるのですが(シリアルモニタ上で確認済み)、タイミングがずれると、以下に示すようにほしい形に正確にデータが通信できません。
原因としては、現状のコードではシリアル通信の順番に構わず、来た順番にデータをアウトプットしてしまうので、これに順番を守らせるコードを付け足したいのですが、いいアイデアが浮かびません。
便利な手法やアイデアなどございましたら、ぜひご教授お願いいたします。
※プログラムは長さの関係で本質問と関係性の低い箇所は省略させていただいております。
###発生している問題・エラーメッセージ
例
タイミングが正しいとき
2017.03.17,Tue 4:44:07 @ 26.43 °C
タイミングが正しくないとき
02.16.44, 2643:2017:03 @ 00.07 °C
###該当のソースコード
送信側
c
1 2void loop(){ 3 4 DateTime now=RTC.now(); // aktuelle Zeit abrufen 5 show_time_and_date(now); // Datum und Uhrzeit ausgeben 6 7 sensors.requestTemperatures(); // Temperatursensor auslesen 8 show_temperature(sensors.getTempCByIndex(0)); // Temperatur ausgeben 9 10 delay(1000); // 30 Sekunden warten bis zur nächsten Ausgabe 11} 12 13// Wochentag ermitteln 14String get_day_of_week(uint8_t dow){ 15 16 String dows=" "; 17 switch(dow){ 18 case 0: dows="Sun"; break; 19 case 1: dows="Mon"; break; 20 case 2: dows="Tue"; break; 21 case 3: dows="Wed"; break; 22 case 4: dows="Thu"; break; 23 case 5: dows="Fri"; break; 24 case 6: dows="Sat"; break; 25 } 26 return dows; 27} 28 29// Datum und Uhrzeit ausgeben 30void show_time_and_date(DateTime datetime){ 31 32/////////////////////////////////////////////// 33 int byou=datetime.second(); 34 int fun=datetime.minute(); 35 int zikan=datetime.hour(); 36 int hi=datetime.day(); 37 int tuki=datetime.month(); 38 int nen=datetime.year(); 39 int youbi=datetime.dayOfWeek(); 40 41 sendNenData(nen); 42 sendTukiData(tuki); 43 sendHiData(hi); 44 sendYoubiData(youbi); 45 sendZikanData(zikan); 46 sendFunData(fun); 47 sendByouData(byou); 48} 49 50void sendNenData(int value){ 51 Serial.write('H'); // ヘッダの送信 52 Serial.write(lowByte(value)); // 下位バイトの送信 53 Serial.write(highByte(value)); // 上位バイトの送信 54} 55void sendTukiData(int value){ 56 Serial.write('H'); // ヘッダの送信 57 Serial.write(lowByte(value)); // 下位バイトの送信 58 Serial.write(highByte(value)); // 上位バイトの送信 59} 60void sendHiData(int value){ 61 Serial.write('H'); // ヘッダの送信 62 Serial.write(lowByte(value)); // 下位バイトの送信 63 Serial.write(highByte(value)); // 上位バイトの送信 64} 65void sendYoubiData(int value){ 66 Serial.write('H'); // ヘッダの送信 67 Serial.write(lowByte(value)); // 下位バイトの送信 68 Serial.write(highByte(value)); // 上位バイトの送信 69} 70void sendZikanData(int value){ 71 Serial.write('H'); // ヘッダの送信 72 Serial.write(lowByte(value)); // 下位バイトの送信 73 Serial.write(highByte(value)); // 上位バイトの送信 74} 75void sendFunData(int value){ 76 Serial.write('H'); // ヘッダの送信 77 Serial.write(lowByte(value)); // 下位バイトの送信 78 Serial.write(highByte(value)); // 上位バイトの送信 79} 80void sendByouData(int value){ 81 Serial.write('H'); // ヘッダの送信 82 Serial.write(lowByte(value)); // 下位バイトの送信 83 Serial.write(highByte(value)); // 上位バイトの送信 84}
受信側
c
1 2void loop() { 3// 受信バッファに3バイト(ヘッダ+int)以上のデータが着ているか確認 4 if ( Serial2.available() >= sizeof('H') + sizeof(int) ) { 5// ヘッダの確認 6 if( Serial2.read() == 'H'){ 7 int low = Serial2.read(); // 下位バイトの読み取り 8 int high = Serial2.read(); // 上位バイトの読み取り 9 recv_data = makeWord(high,low); // 上位バイトと下位バイトを合体させてint型データを復元 10 11 if( recv_data <10 && counter!=3)Serial.print(0); 12 if(counter!=3){ 13 Serial.print(recv_data); 14 } 15 } 16 counter++; 17//Serial.print(counter); 18 switch(counter){ 19 case 1: Serial.print("."); break; 20 case 2: Serial.print("."); break; 21 case 3: Serial.print(", "); break; 22 case 4: 23 if(recv_data==0)Serial.print("Sun"); 24 if(recv_data==1)Serial.print("Mon"); 25 if(recv_data==2)Serial.print("Tue"); 26 if(recv_data==3)Serial.print("Wed"); 27 if(recv_data==4)Serial.print("Thu"); 28 if(recv_data==5)Serial.print("Fri"); 29 if(recv_data==6)Serial.print("Sat"); 30 Serial.println(""); 31 break; 32 case 5: Serial.print(":"); break; 33 case 6: Serial.print(":"); break; 34 case 7: Serial.println(""); break; 35 } 36 37 38 if(counter==7){ 39 counter=0; 40 } 41 } 42
###補足情報(言語/FW/ツール等のバージョンなど)
Arduino IDE 1.8.0
Arduino M0 Pro
Arduino NANO
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/07 10:20
2017/03/07 10:46 編集
2017/03/08 02:50
2017/03/08 04:31