You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

问题根因

  1. 核心逻辑偏差:串口通信默认传输原始二进制字节流,手动拼接反斜杠、0x前缀生成的是普通ASCII文本,内容是反斜杠、数字、字母字符,并非整数对应的原始字节值,本身就不符合绝大多数串口协议的格式要求。
  2. 转义显示误解:Python打印bytes类型对象时,会自动对内容中的反斜杠做转义显示,单个实际存储的反斜杠会显示为\\,这是解释器的repr显示规则,不代表字节里真的存了两个反斜杠。
  3. 转义规则误用:\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.21 16:16:01