切换主题
Protocol Parser —— 从 Byte Stream 到完整 Frame门
用一句话说明这篇笔记最终要解决的问题。
1. 问题与背景
Protocol 模块绝不能知道 STM32、HAL、UART、DMA、FreeRTOS
先定义一个简单但完整的协议: ┌──────┬──────┬─────┬─────┬────────────┬──────┐ │ 0xAA │ 0x55 │ CMD │ LEN │ PAYLOAD │ CS │ └──────┴──────┴─────┴─────┴────────────┴──────┘ 1 1 1 1 LEN Byte 1 含义: 0xAA --- 帧头1 0x55 --- 帧头2 CMD --- 消息类型 LEN --- Payload长度 PAYLOAD --- 真正数据 CS --- 简单XOR校验
重点是:状态机解析 协议层一定需要状态机:一次 RingBuffer_Read()几乎不可能恰好是不多不少完整的一帧
协议解析器必须能够:吃多少算多少,把解析进度保存下来,下次数据来了继续。 typedef enum { PROTOCOL_STATE_WAIT_HEADER_1 = 0, PROTOCOL_STATE_WAIT_HEADER_2, PROTOCOL_STATE_WAIT_CMD, PROTOCOL_STATE_WAIT_LENGTH, PROTOCOL_STATE_WAIT_PAYLOAD, PROTOCOL_STATE_WAIT_CHECKSUM
} ProtocolState_t; 一共六个状态: 等 AA ↓ 等 55 ↓ 等 CMD ↓ 等 LEN ↓ 收 Payload ↓ 等 Checksum
2. 必要基础
3. 底层原理
4. 数据流与调用流程
5. 最小验证实验
实验环境
| 项目 | 配置 |
|---|---|
| MCU / 平台 | |
| 开发工具 | |
| 库 / 框架 |
关键代码
c
// 只保留能解释机制的关键代码