背景前文在打通了雷达串口协议之后,接收到雷达数据流,但是只在屏幕上展示了原始数据,没有直观地展示雷达检测结果。现在把数据解析出来,并在屏幕上绘制雷达检测的距离曲线图。雷达串口解析关键代码雷达串口协议解析,用一个 RadarParser 类来实现解析
class RadarParser:
FRAME_HEADER = 0x59
FRAME_SIZE = 25
def verify(self, buf):
if not buf or len(buf) != self.FRAME_SIZE: return False
if buf[0] != self.FRAME_HEADER: return False
checksum_calc = sum(buf[:23]) & 0xFFFF
return ((buf[24] << 8) | buf[23]) == checksum_calc
def parse(self, buf):
if not self.verify(buf): return None
return {"det_result": buf[4], "range_val_mm": (buf[6] << 8) | buf[5], "rb_conf": buf[17]}
@staticmethod
def get_dominant_status(status_buffer):
if not status_buffer: return "NONE"
priority_map = [(1 << 0, "MOVE_CLOSE"), (1 << 1, "MOVE_FAR"), (1 << 2, "STAY"), (1 << 3, "MICRO"), (1 << 4, "PRESENCE")]
combined_mask = 0
for mask in status_buffer: combined_mask |= mask
for bit, name in priority_map:
if combined_mask & bit: return name
return "NONE"
parser = RadarParser()FRAME_HEADER = 0x59 帧头标识,十六进制 0x59
FRAME_SIZE = 25 数据帧固定长度为 25 字节
功能:验证接收到的数据帧是否有效
- 校验步骤:
检查数据是否为空且长度是否为25字节
检查第一个字节是否为帧头 0x59
计算校验和:对前23个字节求和,取低16位
与帧中最后两个字节(第23、24位)组成的16位校验值比较
功能:解析验证通过的数据帧
- 解析字段
det_result 第四字节,检测结果
range_val_mm 第5~6字节组成的16位距离值(单位:毫米)
rb_conf 第17字节,置信度
功能:从多个状态字节中提取优先级最高的状态
- 优先级映射:
bit0 :近距离移动 MOVE_CLOSE
bit1 : 远距离移动 MOVE_FAR
bit2 : 静止
bit3 : 微动 MICRO
bit4 : 存在 PRESENCE
逻辑:将所有状态字节按位或,然后按优先级返回第一个匹配的状态
实时监测人体距离和运动状态
显示距离历史趋势图
雷达丢失报警
多线程处理(UI线程+雷达数据采集线程)

我要赚赏金
