Python如何创建字节列表 正确处理反斜杠实现串口数据发送
Python整数列表转串口可用字节对象方案
问题场景
串口通信开发中,需将整数命令列表转换为字节对象发送至COM端口连接的设备,原有代码生成的字节对象打印时显示双反斜杠\\,设备无法正常识别。
原有错误实现代码:
cmdlist = [2, 12, 1, 1, 1, 0, 0, 1, 3, 7, 42, 101, 85, 18] #Convert CMD list to Hex List for i in range(len(cmdlist)): cmdlist[i] = hex(cmdlist[i]) f_cmdList = '' #Convert hex CMD list to string List for i in range(len(cmdlist)): f_cmdList += '\\' + (cmdlist[i]) Final_cmdlist = (bytes(f_cmdList,'utf-8')) print(Final_cmdlist)
- 当前打印输出:
b'\\0x2\\0xc\\0x1\\0x1\\0x1\\0x0\\0x0\\0x1\\0x3\\0x7\\0x2a\\0x65\\0x55\\0x12' - 预期输出:
b'\0x2\0xc\0x1\0x1\0x1\0x0\0x0\0x1\0x3\0x7\0x2a\0x65\0x55\0x12'
问题根因
- 核心逻辑偏差:串口通信默认传输原始二进制字节流,手动拼接反斜杠、
0x前缀生成的是普通ASCII文本,内容是反斜杠、数字、字母字符,并非整数对应的原始字节值,本身就不符合绝大多数串口协议的格式要求。 - 转义显示误解:Python打印bytes类型对象时,会自动对内容中的反斜杠做转义显示,单个实际存储的反斜杠会显示为
\\,这是解释器的repr显示规则,不代表字节里真的存了两个反斜杠。 - 转义规则误用:
\x开头的十六进制转义是Python字符串字面量的语法规则,仅在代码编写阶段生效,运行时拼接字符串不会自动把\0x2这类内容解析成对应数值的字节。
正确实现方案
方案1:生成串口通用原始字节流(99%场景适用)
如果需求是发送每个整数对应的单字节值(比如整数2对应字节值0x02,整数12对应字节值0x0c),不需要做任何字符串拼接,直接把整数列表传入bytes构造函数即可,生成的就是设备可识别的标准二进制字节流:
cmdlist = [2, 12, 1, 1, 1, 0, 0, 1, 3, 7, 42, 101, 85, 18] final_cmdlist = bytes(cmdlist) print(final_cmdlist)
输出为b'\x02\x0c\x01\x01\x01\x00\x00\x01\x03\x07*eU\x12',可直接通过串口write方法发送。
方案2:生成带反斜杠前缀的ASCII格式字节串
如果设备协议明确要求传输\0x2这类ASCII格式的转义文本,不需要修改现有拼接逻辑,打印时看到的\\只是显示效果,实际字节中仅包含单个反斜杠,可直接发送。如果需要确认实际内容,将字节解码为字符串打印即可:
cmdlist = [2, 12, 1, 1, 1, 0, 0, 1, 3, 7, 42, 101, 85, 18] f_cmdList = ''.join(f'\\{hex(i)}' for i in cmdlist) final_cmdlist = f_cmdList.encode('utf-8') # 解码后打印可看到单个反斜杠的实际内容 print(final_cmdlist.decode('utf-8'))
解码后输出为\0x2\0xc\0x1\0x1\0x1\0x0\0x0\0x1\0x3\0x7\0x2a\0x65\0x55\0x12,和预期格式完全一致。
内容的提问来源于stack exchange,提问作者Chetan
相关产品推荐
相关产品推荐

