如何阻止bytes.fromhex将十六进制值转换为ASCII字符表示?
问题解决思路
首先明确核心误区:bytes.fromhex('43')生成的字节本身是正确的0x43,Python显示为b'C'只是因为0x43对应ASCII可打印字符'C',这是Python的优化显示方式,实际字节数据和b'\x43'完全等价。你可以通过以下代码验证:
b1 = bytes.fromhex('43') b2 = b'\x43' print(b1 == b2) # 输出True print(list(b1)) # 输出[67],即0x43的十进制值
接下来针对你的场景给出具体解决步骤:
直接使用原始字节字面量构造指令
如果你担心fromhex的显示造成混淆,直接用最初的bytes字面量即可,它和fromhex生成的指令完全一致:cmd = b'\x01\x10\x00\x08\x00\x02\x04\x00\x00\x16\x43\xe7\xf5'排查
pumpSendData函数的处理逻辑
问题的根源可能不在字节构造,而在pumpSendData对字节的处理上:- 如果函数要求接收原始字节流,那当前构造的
cmd是正确的,直接传入即可,无需额外处理; - 如果函数错误地将bytes对象解码为字符串(比如调用了
cmd.decode('ascii')),会导致字节被转换为字符发送,此时需要修改函数,确保它直接发送原始字节数据,不做解码操作。
- 如果函数要求接收原始字节流,那当前构造的
验证实际串口发送数据
用串口调试工具监听发送端口,查看实际发出的字节值。如果工具显示对应位置是0x43,说明字节构造和发送都没问题,只是Python的显示方式让你产生了误解;如果显示的是字符'C'的ASCII值以外的内容,再针对性排查pumpSendData的转换逻辑。
内容的提问来源于stack exchange,提问作者WhiteSpaceTrent
相关产品推荐
相关产品推荐

