pyserial的二进制数据(python串口)

时间:2009-01-23 14:02:43

标签: python binary serial-port pyserial

pyserial中的

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

我想我可能需要将数组更改为['\ xc0','\ x04','\ x00'],仍然,null字符可能会造成问题。

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:11)

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

"\xc0\x04\x00"

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

一种方法:

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

答案 2 :(得分:1)

我遇到了类似的问题(但可能更糟),必须通过python脚本通过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 )