使用pyserial发送二进制数据

Posted

技术标签:

【中文标题】使用pyserial发送二进制数据【英文标题】:Using pyserial to send binary data 【发布时间】:2013-07-11 09:34:55 【问题描述】:

我知道对此进行了很多讨论,但我仍有一个问题。我正在尝试使用 pyserial 通过 pyserial 将十六进制值发送到我的设备

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

但是我一直收到错误提示 string argument without encoding. 有人知道如何解决这个问题吗?

【问题讨论】:

为什么不使用binasciifrom binascii import unhexlify,然后是command = unhexlify("894556") 您使用的是什么版本的 Python?完整的追溯是什么样的? 【参考方案1】:
packet = bytearray()
packet.append(0x41)
packet.append(0x42)
packet.append(0x43)

ser.write(packet)

【讨论】:

【参考方案2】:

来自 pySerial API documentation:

write(data) 将字节数据写入端口。这应该是字节类型(或兼容的,例如 bytearray 或 memoryview)。 Unicode 字符串必须经过编码(例如 'hello'.encode('utf-8')。

假设您正在使用 Python 3(您应该),这是发送单个字节的方式:

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

对于几个字节:

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

【讨论】:

【参考方案3】:

我已经成功地从这样的字符串发送十六进制值:

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

>> sending snp «☺ 

【讨论】:

【参考方案4】:

如果这是 Python 3,它可能会将您的字符串视为 unicode,并且不知道如何转换它。我想你可能是想在这里使用字节:

command=b"\x89\x45\x56"

【讨论】:

【参考方案5】:

如果您使用 Python 3,则可以使用 bytes 对象。

command=b"\x89\x45\x56"

从错误看来,pyserial 试图将(您的)字符串转换为字节对象而不指定编码。

【讨论】:

【参考方案6】:

谢谢,

最后,我弄清楚如何读取二进制文件的指定区域并通过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

【讨论】:

以上是关于使用pyserial发送二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

Pyserial 实现串口 base on python3

串口发送16进制1234,用python接收的是'\x01\x01\x03\x04'但用python再怎么转换成原来的数据1234呢?

python中pyserial模块使用方法

使用 pyserial 将数据发送到串行 - 在 Razor 9DOF IMU 上工作

可以在网站上使用 pySerial 打开并将数据发送到本地计算机上的串行端口吗?

GNU/Linux - Python3 - PySerial:如何通过 USB 连接发送数据?