使用機器：Arduio Uno

以下のようなコードでArduino⇔PC間をUSBで接続して通信しています．  
PCから文字列"123"をバイトに変換し，Arduinoに送信．Arduinoはデータをそのまま返信し，PC側で受信，という流れです．  
Arduino側：

```

    void setup() {
      Serial.begin(115200);
    }
    
    // the loop function runs over and over again forever
    void loop() {
      if(Serial.available() > 0){
      byte data = Serial.read();
      Serial.write(data);
      }
    }
    
```

Python(PC)側：

```

    import serial, time
    
    
    print("Open Port")
    ser = serial.Serial()
    ser.port = "COM3"     #デバイスマネージャでArduinoのポート確認
    ser.baudrate = 115200 #Arduinoと合わせる
    ser.setDTR(False)     #DTRを常にLOWにしReset阻止
    ser.open()            #COMポートを開く
    
    # 送信
    sendStr = "123"
    sendData = sendStr.encode()
    ser.write(sendData)
    
    # 受信
    while True:
        str = ser.read()
        print(str)
        int_data = int.from_bytes(str, 'big')
        print(int_data)
    
    
    ser.close()           #COMポートを閉じる
    
```

このとき，ボーレート(bps)を9600や14400，57600としたときは，正常にb'1'，b'2'，b'3'と受信できるのですが，ボーレートを300や19200，115200とすると先頭にb'\xff'やb'x0c'といったデータが混入します．  
なぜでしょうか？

以下，各ボーレートでの実行結果です．

```

    300    : b'\x0c' b'\x8c' b'1' b'2' b'3'
    1200,2400,4800,9600,14400 : 正常受信
    19200  : b'\xff' b'1' b'2' b'3'
    28800  : b'\xff' b'1' b'2' b'3'
    38400  : b'\xfe' b'1' b'2' b'3'
    57600  : 正常受信
    115200 : b'xf0' b'xf0' b'1' b'2' b'3'
    
```
CC BY-SA 4.0
2020-09-15T07:24:43.947
70405
2020-12-17T14:02:35.307
2020-09-15T07:29:44.327
32986
41915
question
python3 arduino シリアル通信
Arduino⇔Python間のシリアル通信で，ボーレート(bps)によって謎のデータが先頭に混入するのはなぜでしょうか
提示コードだと典型的「無手順通信」です。つまり電文がどこから始まってどこから終わるのか受け取る側 = Arduino
にとって不明です。そのためたまたま電文の途中から受け取る可能性があって、そうすると化けて見えます。ボーレートによって化けたり化けなかったりはたまたまですね（もっと詳しい「化け原理」の解説が必要ですか？）

なので手順（開始＋終了の約束）を決めてください。これをプロトコルと言います。

  * `STX` \+ 本文 + `ETX` でもいいし
  * 本文 + 改行 でもいいし
  * 本文 + 無信号時間 でもいいし
  * あなた独自の手順でもよいです（開始終了が確実にわかればヨシ）

最初のやつなら受け取る側は

  * 受信データが `STX` 以外の値なら全部無視する
  * `STX` が来たら `ETX` までを受け取る (送る側がバグっている可能性を鑑みて、バッファオーバーフローにならないよう注意）
  * `ETX` が来たら初期状態に戻る

最初の１回は捨てられちゃいますがしかたないです。

送受信データの妥当性を保証するために「チェックサム」とか「 CRC 」とかでチェックコードを付けるともっと良いですね。
CC BY-SA 4.0
2020-09-15T07:41:06.263
70406
2020-09-15T07:41:06.263
8589
70405
answer