web-dev-qa-db-ja.com

pyserialを使用してバイナリデータを送信する

これについて多くの議論があったことは知っていますが、まだ質問があります。 pyserialを使用してpyserialを介して16進値をデバイスに送信しようとしています

command="\x89\x45\x56"
ser.write(command)

しかし、string argument without encoding.というエラーが表示され続けます。これを解決する方法を知っている人はいますか?

7
BladeRunner
packet = bytearray()
packet.append(0x41)
packet.append(0x42)
packet.append(0x43)

ser.write(packet)
5
rjha94

次のような文字列から16進値を送信することに成功しました。

input = '736e7000ae01FF'    
ser.write(input.decode("hex"))
print "sending",input.decode("hex")

>> sending snp «☺ 
2
jjz

Python 3を使用する場合は、bytesオブジェクトを使用できます。

command=b"\x89\x45\x56"

エラーから、pyserialはエンコーディングを指定せずに(あなたの)文字列をバイトオブジェクトに変換しようとしているように見えます。

1
TobiMarg

これがPython 3の場合、おそらく文字列をUnicodeとして扱っており、変換方法がわかりません。おそらくここでバイトを使用するつもりだと思います。

command=b"\x89\x45\x56"
1

ありがとう、

最後に、バイナリファイルの指定領域を読み取り、(フロー制御として)uartを介して送信する方法を理解します。

    binary_file = open("test_small.jpg", 'rb')
    filesize = getSize(binary_file)
    ser = serial.Serial('COM7', 115200, timeout=0.5)
    count = 0
    while (offset < filesize):
        binary_file.seek(offset, 0)
        ser.write(binary_file.read(MTU))
        offset = offset + MTU
0
Jimmy Wong

PySerial APIから ドキュメント

write(data)バイトデータをポートに書き込みます。これはバイト型(またはbytearrayやmemoryviewなどの互換性がある)である必要があります。 Unicode文字列をエンコードする必要があります(例: 'hello'.encode(' utf-8 ')。

Python 3(必要))に取り組んでいるとすると、これは1バイトを送信する方法です。

command = b'\x61' # 'a' character in hex
ser.write(command)

数バイトの場合:

command = b'\x48\x65\x6c\x6c\x6f' # 'Hello' string in hex
ser.write(command)
0
amartin1911