pyserial 中的 serial.write() 方法似乎只发送字符串数据。我有像 [0xc0,0x04,0x00] 这样的数组,并且希望能够通过串口发送/接收它们?原始 I/O 是否有任何单独的方法?
我想我可能需要将数组更改为 ['\xc0','\x04','\x00'],但空字符可能会造成问题。
pyserial 中的 serial.write() 方法似乎只发送字符串数据。我有像 [0xc0,0x04,0x00] 这样的数组,并且希望能够通过串口发送/接收它们?原始 I/O 是否有任何单独的方法?
我想我可能需要将数组更改为 ['\xc0','\x04','\x00'],但空字符可能会造成问题。
另一种方法,不使用array
模块:
def a2s(arr):
""" Array of integer byte values --> binary string
"""
return ''.join(chr(b) for b in arr)
您需要将数据转换为字符串
"\xc0\x04\x00"
空字符在 Python 中不是问题——字符串不是以空字符结尾的,零字节的行为就像另一个字节一样"\x00"
。
一种方法:
>>> import array
>>> array.array('B', [0xc0, 0x04, 0x00]).tostring()
'\xc0\x04\x00'
我遇到了类似(但可以说更糟)的问题,必须通过 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 )