十进制转十六进制异常及USB串口通信数据显示问题求助
USB串口通信中Bytearray显示与十进制转十六进制问题解答
关于Bytearray显示的“异常”问题
你遇到的bytearray(b'\x822')其实是Python的正常行为,不是错误!核心原因是:
- Python在打印
bytearray或bytes对象时,会对可打印的ASCII字符(ASCII码32~126之间的数值)直接显示对应的字符,而非十六进制转义。 - 你的示例中50对应的ASCII字符就是
'2',所以Python会直接显示'2',而不是\x32;但实际存储的字节值仍然是0x32(也就是十进制的50),完全不影响串口发送的内容。
可以用以下代码验证这一点:
elements = [130, 50] registerValue = bytearray(elements) # 查看单个字节的十进制和十六进制值 print(f"第二个字节的十进制值: {registerValue[1]}") # 输出 50 print(f"第二个字节的十六进制值: {hex(registerValue[1])}") # 输出 0x32 # 串口发送的是字节本身,和打印显示无关 ser.write(registerValue)
如果想要强制以统一的十六进制转义格式显示,可以自己格式化输出:
formatted = ''.join(f'\\x{b:02x}' for b in registerValue) print(f"统一十六进制显示: bytearray(b'{formatted}')") # 输出 bytearray(b'\x82\x32')
十进制转十六进制的转换问题
从你的需求来看,本质是要把十进制整数(0~255范围,因为串口字节是8位)转换成对应的字节值,你原来的bytearray(elements)写法已经是正确的:
- 十进制整数直接传入
bytearray,会自动转换成对应的8位字节(即十六进制表示的字节)。比如130 →0x82,50 →0x32。
如果是需要把十进制数转换成十六进制字符串(比如用于日志或调试),可以用这两种方式:
- 使用
hex()函数:
num = 50 hex_str = hex(num)[2:] # 去掉前缀'0x',得到'32'
- 使用
format()函数(更灵活,可指定两位补零):
num = 50 hex_str = format(num, '02x') # 得到'32';如果是10,会得到'0a'
总结
- 串口发送的是字节的实际数值,Python打印
bytearray时的字符显示只是可视化方式,不影响通信正确性。 - 十进制到字节的转换用
bytearray(十进制列表)就足够,完全满足串口通信的需求。
内容的提问来源于stack exchange,提问作者Amir Asgari
相关产品推荐
相关产品推荐

