Python中如何像拼接字符串一样拼接bytearray?拼接报错求助
解决Python生成串口通信bytearray的问题
你的代码报错核心原因是字节串与字符串直接拼接类型不兼容,且用字符串拼接数字的方式无法生成你需要的十六进制字节值。以下是两种简单直接的解决方案:
方案1:直接用整数列表构造bytearray(推荐)
因为你的参数fallblattadresse(0-7)和fallblattcode(0-61)都是小于256的整数,直接将它们作为字节值传入bytearray的构造函数即可,自动对应十六进制字节:
def sendfallblatt(fallblattadresse, fallblattcode): # <BREAK> FF <COMMAND> <ADDR> < VALUE> ComPort = serial.Serial('COM5') ComPort.baudrate = 19200 ComPort.bytesize = 8 ComPort.parity = 'N' ComPort.stopbits = 1 # 直接用整数列表构造,每个整数对应一个字节的十六进制值 data = bytearray([0xff, 0xc0, fallblattadresse, fallblattcode]) print(data) # 调用sendfallblatt(1,2)时会输出 bytearray(b'\xff\xc0\x01\x02') ComPort.send_break(0.06) ComPort.write(data) ComPort.close()
这个方案还直接解决了你担心的“数值超过9”的问题,比如传入fallblattcode=10,会自动生成0x0a字节。
方案2:字节串拼接(用to_bytes转换整数)
如果习惯用字节串拼接的方式,可以把每个整数转成1字节的字节串,再和固定字节串拼接:
data = b'\xff\xc0' + fallblattadresse.to_bytes(1, byteorder='big') + fallblattcode.to_bytes(1, byteorder='big')
to_bytes(1, byteorder='big')表示将整数转换为1字节的大端字节串,对于0-255的整数,大端小端结果一致。
原代码错误点说明
b'\xff\xc0\x0'是字节串,str(fallblattadresse)是字符串,二者无法直接用+拼接,会触发类型错误。'\x'不是合法的Python转义字符,你想表达的十六进制字节需要用整数直接对应,而非字符串拼接。
内容的提问来源于stack exchange,提问作者Daniele V
相关产品推荐
相关产品推荐

