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

Python串口通信输出异常求助:收到十六进制+ASCII混合数据

解决串口通信中Python字节串显示的误解及数据处理

Hey there! Let's clear up the confusion here and get you seeing the data you expect.

首先:你的数据其实已经正确接收了!

那个看起来像是“十六进制+ASCII混合”的输出b'\x0b\x16 )6\x06\x07\x08X\x02\x16,',只是Python对**字节串(bytes类型)**的默认显示规则:

  • 当字节值对应可打印的ASCII字符时,直接显示该字符
  • 当字节值是不可打印的控制字符(比如<32或>126)时,用十六进制转义符\xXX表示

我们把它和你发送的uint8_t myBuf[]={11,22,32,41,54,6,7,8,88,2,22,44}一一对应验证:

  • 11 → \x0b(不可打印,显示十六进制)
  • 22 → \x16(不可打印)
  • 32 → 空格(ASCII 32是可打印的空格字符)
  • 41 → )(ASCII 41对应右括号)
  • 54 → 6(ASCII 54对应数字6)
  • 6 → \x06(不可打印)
  • 7 → \x07(不可打印)
  • 8 → \x08(不可打印)
  • 88 → X(ASCII 88对应大写X)
  • 2 → \x02(不可打印)
  • 22 → \x16(不可打印)
  • 44 → ,(ASCII 44对应逗号)

完全匹配!所以串口通信本身没有问题,只是显示方式让你误以为数据错了。

如何转换成你期望的uint8数值列表?

如果你想直接看到发送的整数数值,可以把字节串转换成整数列表。修改你的代码如下:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
import serial
import time

MCU = serial.Serial('COM35', 115200, timeout=.1)
time.sleep(1) # 给连接一点时间稳定

while True:
    data = MCU.readline()
    if data:  # 确保收到有效数据再处理
        # 将字节串转换为uint8整数列表
        received_values = list(data)
        print("Received uint8 values:", received_values)

运行这段代码,你应该会输出和myBuf完全一致的列表:[11,22,32,41,54,6,7,8,88,2,22,44]。

额外注意点

  • 确认你的MCU发送数据时,是否在末尾添加了换行符(\n)?因为readline()是等待换行符或超时才返回数据。如果MCU没有发送换行,你可能会收到不完整的数据,这时候可以改用MCU.read(12)直接读取固定长度的12字节数据。
  • 确保串口配置(波特率、校验位、停止位)和MCU端完全一致,默认serial.Serial是无校验、1个停止位,如果你MCU端有不同配置,需要在初始化时指定(比如serial.Serial('COM35', 115200, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_TWO, timeout=.1))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:51:09