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

Python串口原始字节传输异常问题求助

问题原因与解决办法

核心问题

你的问题不是serial.read()的问题,而是把bytes对象转成字符串时的默认转义行为导致的显示差异:

  • 你发送的第1字节是十进制10,对应ASCII码的换行符\n,Python把bytes转成str时会自动将0x0A(十进制10)显示为\n;
  • 第5字节是十进制50,对应ASCII码的字符2,所以转成字符串后直接显示为2;
  • 全0xFF时,因为0xFF不属于可打印ASCII字符,Python会用\xff来表示,和hterm的十六进制显示一致,所以看起来正常。

hterm是按原始字节的十六进制值显示,而Python的str(bytes)会将可打印ASCII字节转换为对应的字符,非可打印字节用转义序列表示,这才是显示差异的根源。

解决方式

直接操作原始的bytes对象,或者将bytes转换为十六进制字符串来查看,避免默认的ASCII转义:

修改后的示例代码

COM_Port = "COM5"
Baudrate = 19200
SerialPort = serial.Serial(COM_Port,Baudrate,bytesize=8,parity=serial.PARITY_NONE,stopbits=1,timeout=None)
while True:
    bytestream = SerialPort.read(8)#read 8 bytes
    # 方式1:转成十六进制字符串,和hterm显示一致
    print(bytestream.hex())
    # 方式2:逐个打印十进制字节值
    print([byte for byte in bytestream])
    # 后续处理直接用bytestream这个bytes对象即可,不要转成str
    # queue_in.put(bytestream)

说明

  • bytestream.hex()会把8字节转成连续的十六进制字符串,比如你发送的{10,1,0,0,0,50,0,0}会显示为0a01000000320000,和hterm的十六进制显示对应;
  • [byte for byte in bytestream]会生成每个字节的十进制列表,输出[10, 1, 0, 0, 0, 50, 0, 0],和你发送的原始数据完全一致;
  • 后续处理数据时,直接使用bytestream这个bytes对象,通过索引访问单个字节(比如bytestream[0]就是第1字节的十进制值),不需要转换成字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:46:14