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

十进制转十六进制异常及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。

如果是需要把十进制数转换成十六进制字符串(比如用于日志或调试),可以用这两种方式:

  1. 使用hex()函数:
num = 50
hex_str = hex(num)[2:]  # 去掉前缀'0x',得到'32'
  1. 使用format()函数(更灵活,可指定两位补零):
num = 50
hex_str = format(num, '02x')  # 得到'32';如果是10,会得到'0a'

总结

  • 串口发送的是字节的实际数值,Python打印bytearray时的字符显示只是可视化方式,不影响通信正确性。
  • 十进制到字节的转换用bytearray(十进制列表)就足够,完全满足串口通信的需求。

内容的提问来源于stack exchange,提问作者Amir Asgari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:30:51