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

树莓派读取MW2401TR11雷达串口数据出现Unicode解码错误如何解决

问题原因

你遇到的报错根本原因是MW2401TR11雷达的串口输出是二进制协议帧,不是UTF-8编码的文本字符串,直接调用decode()方法自然会触发编码错误。

传感器输出帧规则
  • 每帧固定长度5字节
  • 第1字节:固定帧头0xAA
  • 第2字节:检测结果,0x00表示无目标,0x01表示检测到运动目标,0x02表示检测到微动目标
  • 第3字节:固定值0x03
  • 第4字节:预留位,固定0x00
  • 第5字节:校验和(简单使用场景可直接忽略)
修正后的可运行代码
import serial
import time

# 初始化串口,只需打开一次
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
data = []
ab = 0

try:
    while True:
        # 读取固定长度5字节的一帧数据
        b = ser.read(5)
        # 数据长度不足或者帧头不对就跳过当前次读取
        if len(b) != 5 or b[0] != 0xAA:
            time.sleep(0.1)
            continue
        # 取第二个字节为检测状态
        status = b[1]
        # 状态转对应描述
        if status == 0x00:
            status_str = "无目标"
        elif status == 0x01:
            status_str = "运动目标"
        elif status == 0x02:
            status_str = "微动目标"
        else:
            status_str = "异常状态"
        print(f"当前检测结果:{status_str},原始帧:{b.hex()}")
        data.append(status)
        ab += 1
        print(f"累计读取帧数:{ab}")
        time.sleep(0.1)
except KeyboardInterrupt:
    # 按Ctrl+C退出时关闭串口
    ser.close()
    print("程序退出,串口已关闭")
关键修改说明
  • 移除了错误的decode()转字符串操作,传感器输出是二进制数据,不需要转UTF-8文本
  • 串口初始化放在循环外,避免每次循环重复打开关闭串口导致的资源占用错误
  • 用ser.read(5)读取固定长度的帧,替代针对文本场景设计的readline()方法
  • 增加帧头校验逻辑,过滤异常不完整的数据,避免状态误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:09:00