带有pyserial(python串行端口)的二进制数据

问题描述 投票:17回答:3
pyserial中的

serial.write()方法似乎只发送字符串数据。我有类似[0xc0,0x04,0x00]的数组,并希望能够通过串行端口发送/接收它们吗?是否有任何单独的原始I / O方法?

我想我可能需要将数组更改为['\ xc0','\ x04','\ x00'],但是,空字符可能会带来问题。

python binary serial-port pyserial
3个回答
11
投票

您需要将数据转换为字符串

"\xc0\x04\x00"

空字符在Python中不是问题-字符串不是以Null结尾的,零字节的行为就像另一个字节"\x00"

一种方法:

>>> import array
>>> array.array('B', [0xc0, 0x04, 0x00]).tostring()
'\xc0\x04\x00'

12
投票

一种替代方法,不使用array模块:

def a2s(arr):
    """ Array of integer byte values --> binary string
    """
    return ''.join(chr(b) for b in arr)

0
投票

我面临类似(但可能更糟)的问题,必须通过UART从UART脚本发送控制位来测试嵌入式设备。我的数据定义是“ field1:8位,field2:3位,field3 7位”,等等。事实证明,您可以使用BitArray库为此构建健壮且干净的接口。这是一个代码段(减去串行设置)

from bitstring import BitArray

cmdbuf = BitArray(length = 50)     # 50 byte BitArray
cmdbuf.overwrite('0xAA', 0)       # Init the marker byte at the head

这里是灵活的地方。下面的命令替换了4位位位置23,传递了4位。请注意,它花了一个二进制位值,以字符串形式给出。我可以在任何位置设置/清除任何位以这种方式在缓冲区中,而不必担心踩踏相邻字节或位中的值。

cmdbuf.overwrite('0b0110', 23)

# To send on the (previously opened) serial port 
ser.write( cmdbuf )
© www.soinside.com 2019 - 2024. All rights reserved.