PySerial字节命令功能异常 十六进制数组转bytes函数失效问题
问题产生原因
- 混淆了Python源码层面的字节串转义语法和运行时的字符串拼接逻辑:在源码里直接写
b'\xE9'时,\xE9是Python解释器解析代码阶段就会处理的转义序列,会被直接识别为值为0xE9的单个字节,这个转义处理只在源码解析阶段生效,无法通过运行时拼接字符串复现。 - 函数中使用原始字符串前缀
r拼接\x和十六进制片段,运行时生成的是包含字面量反斜杠、字符x、两位十六进制数的普通文本——比如拼接'E9'得到的是4个字符组成的子串\xE9(反斜杠、x、E、9各占一个字符位),根本不是转义后的单字节。 - 后续用
latin-1编码时,这些字面量字符会被逐个编码:反斜杠编码为0x5C、x编码为0x78,最终生成的字节串长度是预期的4倍。你打印错误结果看到的\\x就是字节里真实存在反斜杠字符的证明,内容完全不符合设备要求的协议格式,自然无法驱动设备。
修复方法
不要尝试手动拼接\x转义序列,直接把每个两位十六进制字符串转为对应的0-255整数值,再传入字节构造函数生成目标字节串即可,代码简洁且不会出错:
def string_to_command(inp): return bytes(int(hex_str, 16) for hex_str in inp)
用测试用例验证效果:
input_array = ['E9', '01','06','57','4A','01','F4','01','01','EF'] # 自定义函数输出 print(string_to_command(input_array)) # 字面量定义的预期输出 print(b'\xE9\x01\x06\x57\x4A\x01\xF4\x01\x01\xEF')
运行后两者输出完全一致,生成的字节串符合协议要求,可以正常驱动设备:
b'\xe9\x01\x06WJ\x01\xf4\x01\x01\xef' b'\xe9\x01\x06WJ\x01\xf4\x01\x01\xef'
内容的提问来源于stack exchange,提问作者Dr. Ernesto Chinchilla
相关产品推荐
相关产品推荐

