Skip to content

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
// 只保留能解释机制的关键代码

6. 调试观察

7. 常见错误与根因

8. 真实工程中的用途

9. 我的结论

FreeRTOS 内核与工程实践