17

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

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

4

3 回答 3

12

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

def a2s(arr):
    """ Array of integer byte values --> binary string
    """
    return ''.join(chr(b) for b in arr)
于 2009-08-15T14:19:51.420 回答
11

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

"\xc0\x04\x00"

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

一种方法:

>>> import array
>>> array.array('B', [0xc0, 0x04, 0x00]).tostring()
'\xc0\x04\x00'
于 2009-01-23T14:25:28.137 回答
1

我遇到了类似(但可以说更糟)的问题,必须通过 UART 从 python 脚本发送控制位来测试嵌入式设备。我的数据定义是“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 )
于 2019-11-16T03:36:45.130 回答