前提・実現したいこと
pySerialを使って、シリアル通信をしていた所、受信したBytesデータの中身を上手く取れません。
上手く文字データにデコードする方法を教えていただけませんでしょうか。
よろしくお願いします。
シリアル通信の結果
①の出力:b'\x820\xb10\xb130\xb8\xb4\xb70\xb1\xb23\xb456\xb7\xb8900\xa0\xa0'
②の出力:�0ア0ア30ク550アイ3エ56キク900��
欲しい値:010130847012345678900
発生している問題・エラーメッセージ
decode時に、「\xb1」で「ア」と判断されてしまう。
該当のソースコード
python3
1 2import tkinter 3import serial 4 5# method: connect_test_click 6def connect_test_click(): 7 comport = serial.Serial('COM3', baudrate=9600) 8 recv_data = comport.read(24) 9 print(recv_data) # for debug ① 10 print(recv_data.decode('sjis', 'replace')) # for debug ② 11 TestLabel["text"] = "Result:" + recv_data.decode('sjis', 'replace') 12 comport.close() 13 14# form 15root = tkinter.Tk() 16root.title(u"titleName") 17root.geometry("400x320") 18 19# button 20TestButton = tkinter.Button(text=u'接続テスト', width=20, command=connect_test_click) 21TestButton.grid(padx=10, ipady=10, pady=10) 22 23# label 24TestLabel = tkinter.Label(text=u'*****') 25TestLabel.grid(padx=10) 26 27root.mainloop() 28
試したこと
bytesをsliceで切り取ろうとしたのですが、「\xb1」で1文字と判定されて無理でした。
補足情報(FW/ツールのバージョンなど)
python3.7, pyserial3.5, visualStudio2019
1バイトごとに、16進ダンプ表示すると
>>> print(' '.join(f'{b:x}' for b in b'\x820\xb10\xb130\xb8\xb4\xb70\xb1\xb23\xb456\xb7\xb8900\xa0\xa0'))
82 30 b1 30 b1 33 30 b8 b4 b7 30 b1 b2 33 b4 35 36 b7 b8 39 30 30 a0 a0
となるんですが、どうしてこれが
010130847012345678900
になるのかわかりませんでした。
010130847012345678900 になる**はず**と思っているのはどうしてなのでしょうか。
そのあたりを質問を編集して追記するといいのでは、と思いました。
ありがとうございます。
説明が足りずに、すみません。
010130847012345678900 になるはずなのは機械の仕様からです。
byteデータ扱いなのですが、データ中にこの文字が入っては来てるのです。
\xbが制御コードと考え削除すると、綺麗にならんでいるので、取得データの扱いを間違えてるのだろうと考えてました。
よくみたら「先頭ビットに1が立ってる」という解釈でよさそうでした。(回答にするほどでもないのでこの欄で失礼します)
回答2件
あなたの回答
tips
プレビュー