質問: 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' ```
回答: 提示コードだと典型的「無手順通信」です。つまり電文がどこから始まってどこから終わるのか受け取る側 = Arduino にとって不明です。そのためたまたま電文の途中から受け取る可能性があって、そうすると化けて見えます。ボーレートによって化けたり化けなかったりはたまたまですね(もっと詳しい「化け原理」の解説が必要ですか?) なので手順(開始+終了の約束)を決めてください。これをプロトコルと言います。 * `STX` + 本文 + `ETX` でもいいし * 本文 + 改行 でもいいし * 本文 + 無信号時間 でもいいし * あなた独自の手順でもよいです(開始終了が確実にわかればヨシ) 最初のやつなら受け取る側は * 受信データが `STX` 以外の値なら全部無視する * `STX` が来たら `ETX` までを受け取る (送る側がバグっている可能性を鑑みて、バッファオーバーフローにならないよう注意) * `ETX` が来たら初期状態に戻る 最初の1回は捨てられちゃいますがしかたないです。 送受信データの妥当性を保証するために「チェックサム」とか「 CRC 」とかでチェックコードを付けるともっと良いですね。