116 lines
4.5 KiB
C
116 lines
4.5 KiB
C
/**
|
|
* @file radar_protocol.h
|
|
* @brief R60ABD1 60G 毫米波雷达通信协议定义
|
|
*
|
|
* 协议: SIP-S v1.0 串口协议 (云帆瑞达 Micradar)
|
|
* 帧格式: 帧头(2B) + 控制字(1B) + 命令字(1B) + 长度(2B) + 数据(NB) + 校验(1B) + 帧尾(2B)
|
|
*/
|
|
|
|
#ifndef RADAR_PROTOCOL_H
|
|
#define RADAR_PROTOCOL_H
|
|
|
|
#include <stdint.h>
|
|
|
|
// ============================================================
|
|
// 帧定界符
|
|
// ============================================================
|
|
#define FRAME_HEADER_1 0x53 // 'S'
|
|
#define FRAME_HEADER_2 0x59 // 'Y'
|
|
#define FRAME_TAIL_1 0x54 // 'T'
|
|
#define FRAME_TAIL_2 0x43 // 'C'
|
|
|
|
#define FRAME_HEADER_SIZE 2
|
|
#define FRAME_TAIL_SIZE 2
|
|
#define FRAME_MIN_SIZE 8 // 最小帧: 头2+控制1+命令1+长度2+校验1+尾2 = 9 字节
|
|
|
|
// ============================================================
|
|
// 控制字 (Control Word)
|
|
// ============================================================
|
|
enum RadarControl : uint8_t {
|
|
CTRL_HEARTBEAT = 0x01, // 心跳包
|
|
CTRL_PRODUCT_INFO = 0x02, // 产品信息
|
|
CTRL_OTA = 0x03, // OTA 升级
|
|
CTRL_WORK_STATUS = 0x05, // 工作状态
|
|
CTRL_DETECT_RANGE = 0x07, // 探测范围
|
|
CTRL_PRESENCE = 0x80, // 人体存在
|
|
CTRL_BREATHING = 0x81, // 呼吸检测 (仅 ABD1)
|
|
CTRL_FALL = 0x83, // 跌倒检测 (仅 AFD1)
|
|
CTRL_SLEEP = 0x84, // 睡眠监测 (仅 ABD1)
|
|
CTRL_HEART_RATE = 0x85, // 心率监测 (仅 ABD1)
|
|
};
|
|
|
|
// ============================================================
|
|
// 命令字 (Command Word)
|
|
// ============================================================
|
|
enum RadarCommand : uint8_t {
|
|
CMD_QUERY = 0x01, // 查询命令
|
|
CMD_REPORT = 0x02, // 主动上报
|
|
CMD_SET = 0x03, // 设置命令
|
|
CMD_ACK = 0x04, // 应答
|
|
};
|
|
|
|
// ============================================================
|
|
// 工作状态命令 (CTRL_WORK_STATUS 下的子命令)
|
|
// ============================================================
|
|
enum WorkStatusCmd : uint8_t {
|
|
WS_INIT_COMPLETE = 0x01, // 初始化完成
|
|
WS_INIT_QUERY = 0x81, // 查询初始化状态
|
|
WS_POS_OUT_BOUNDS = 0x07, // 位置超出范围
|
|
};
|
|
|
|
// ============================================================
|
|
// 呼吸状态
|
|
// ============================================================
|
|
enum RespirationStatus : uint8_t {
|
|
RESPI_NORMAL = 0, // 正常 (10~25 次/分)
|
|
RESPI_HIGH = 1, // 过高 (>25)
|
|
RESPI_LOW = 2, // 过低 (<10)
|
|
};
|
|
|
|
// ============================================================
|
|
// 睡眠状态
|
|
// ============================================================
|
|
enum SleepStatus : uint8_t {
|
|
SLEEP_AWAKE = 0, // 清醒
|
|
SLEEP_LIGHT = 1, // 浅睡
|
|
SLEEP_DEEP = 2, // 深睡
|
|
};
|
|
|
|
// ============================================================
|
|
// 帧解析状态机
|
|
// ============================================================
|
|
enum FrameState {
|
|
STATE_IDLE, // 等待帧头 0x53
|
|
STATE_GOT_HEADER1, // 已收到 0x53, 等待 0x59
|
|
STATE_GOT_HEADER2, // 已收到帧头, 等待控制字
|
|
STATE_GOT_CONTROL, // 已收到控制字, 等待命令字
|
|
STATE_GOT_COMMAND, // 已收到命令字, 等待长度高字节
|
|
STATE_GOT_LEN_H, // 已收到长度高字节, 等待长度低字节
|
|
STATE_GOT_LEN_L, // 已收到长度低字节, 读取数据
|
|
STATE_GOT_DATA, // 数据接收完成, 等待校验
|
|
STATE_GOT_CHECKSUM, // 已收到校验, 等待帧尾 0x54
|
|
STATE_GOT_TAIL1, // 已收到 0x54, 等待 0x43
|
|
STATE_FRAME_COMPLETE, // 帧接收完成
|
|
};
|
|
|
|
// ============================================================
|
|
// 帧缓冲区大小
|
|
// ============================================================
|
|
#define RADAR_FRAME_BUF_SIZE 128 // 单帧最大缓冲区
|
|
#define RADAR_RING_BUF_SIZE 512 // 环形接收缓冲区
|
|
|
|
// ============================================================
|
|
// 解析后的雷达帧数据 (原始)
|
|
// ============================================================
|
|
struct RadarFrame {
|
|
uint8_t control;
|
|
uint8_t command;
|
|
uint16_t data_length;
|
|
uint8_t data[RADAR_FRAME_BUF_SIZE];
|
|
uint8_t checksum;
|
|
bool valid; // 校验通过
|
|
uint32_t timestamp;
|
|
};
|
|
|
|
#endif // RADAR_PROTOCOL_H
|