2021年4月15日木曜日

ArduinoUNO x Python3のSerial通信[read_until]が上手くいかない

Python2では

ser = serial.Serial( "/dev/ttyACM0" , 115200 , timeout = 0.01)
〜〜省略〜〜
received = ser.read_until("k")
str_value = re.sub(r'\D' , '' , received)
num = int(str_value)

で"k"区切りになっていた値を受け取れていたのにPython3では

NameError : name 'received' is not defined

と出る。。。
調べてみたら「python3では、文字列とバイト列の区別が明確になりました。」との事。
どうやらこいつの影響っぽい。

Python2
received = ser.read_until("k")

Python3
received = ser.read_until(b'\x6b')#kをbytes型で指定

これだと b'a200k' のような状態なので、これをそのままstr型の文字列に変換して
余計なものを取る。
received = str( ser.read_until(b'\x6b') )
received = received[ 2 : len(received)-1 ]

とっても後味悪い方法に。。

以下、参考にしたサイト
python3のbytes型とstr型の比較と変換方法
Python3での文字列のstr型とbytes型のまとめ
Raspberry Pi と Arduino でUSBシリアル通信(複数の値を送受信)(第二弾)


0 件のコメント:

コメントを投稿