70170


Arduino間でシリアル通信をしようとしています。  
Arduino pro micro 2台のRX.TXをそれぞれ結線し、通信は上手くいったかと思われました。  
以下が送信側のプログラムです。下記のようなプログラムの場合、受信側では`100,111,121,100,111,121...`
と受信されるものだと考えていました。

しかし実際は `100,100,111,121,100,111,111,121...`
のように不規則に値が２度受信される場合があります。数値の順序は正しいので抜け落ちの可能性は低いと考えています。ここではあくまで「複数回送信されている値がある」ことが問題なので100が先頭に来ていない（ヘッダなどを用意していない）ことは問題ではありません。

これが送信側の問題なのか、受信側の問題なのか、それとも仕様なのか、解決策をご存じの方がいらっしゃいましたらご教授いただけると幸いです。（ハードウェアは複数試し、異常がないことを確認しています。）

**送信側:**

[code]

    void setup() {
     Serial1.begin(115200);
    }
    
    void loop() {
      Serial1.write(100);
      Serial1.write(111);
    　Serial1.write(121);
    }
    
[/code]

**受信側:**

[code]

    int x, y, z;
    
    void setup() {
      Serial.begin(115200);
      Serial1.begin(115200);
    }
    
    void loop() {
      x = Serial1.read();
      y = Serial1.read();
      z = Serial1.read();
    
      Serial.print(x);
      Serial.print(",");
      Serial.print(y);
      Serial.print(",");
      Serial.println(z);
    }
    
[/code]


CC BY-SA 4.0
2020-09-05T13:19:02.493
70168
2020-09-05T15:35:40.710
2020-09-05T15:35:40.710
3060
40293
question
arduino シリアル通信
Arduino間通信時のSerial.write関数の挙動について


手元に使えるArduinoが無いので予測を書きます。

例示されている場合だと2連続で値が抜け落ちれば100 100 111 121のような並びは発生し得ます。  
ではなぜ値が抜け落ちるのかという話になりますが、受信側がread()する速度よりも早くwrite()が行われると、いずれシリアルの受信バッファーが溢れることになります。その場合抜け落ちが生じるわけです（もちろん酷い通信ノイズや端子の接触ということもあります）

例示されているプログラムの場合、受信側はSerial.print()を実行していますのでその分送信側よりもloop()実行時間は長くなります。したがってread()でバッファーから値が取り出されるよりも早くデータが送られてくることになり抜け落ちが生じると思います。

（シリアル通信のread()はバッファーの中身を読んでいます。データが送られてくるタイミングは相手次第のため、こちらがread()できるようになるまでバッファーに溜めておくわけです。そしてArduino
due(おそらくpro microも）の受信バッファーは64byte程度しかありません）


CC BY-SA 4.0
2020-09-05T13:38:35.677
70170
2020-09-05T13:38:35.677
41782
70168
answer