树莓派读取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
相关产品推荐
相关产品推荐

