<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on zhangbo</title><link>https://zhangboz.cc/posts/</link><description>Recent content in Posts on zhangbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 04 Aug 2026 17:58:57 +0800</lastBuildDate><atom:link href="https://zhangboz.cc/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>一种通用 HEX 协议解析器的简单实现</title><link>https://zhangboz.cc/posts/generic-hex-protocol-parser/</link><pubDate>Tue, 04 Aug 2026 17:58:57 +0800</pubDate><guid>https://zhangboz.cc/posts/generic-hex-protocol-parser/</guid><description>一种通用 HEX 协议解析器的简单实现 背景描述 在嵌入式开发中，MCU 通常会与其它模块进行数据交互。简单来说，常见的数据大概有两种：一种是明文字符串流，比如类似 AT 指令；另一种是 HEX 字节流。
本文实现一种能够较为广泛使用的通用协议解析器，用来处理 HEX 数据。
本文按 protocol_lib 仓库当前最新源码整理，对应提交为 5b0c86b。和最初版本相比，现在输入、输出缓冲区可以按实例配置，多协议之间的匹配状态也已经完全分开。
一、前言 HEX 协议基本都是私有定制的，但它们又有一定共性。比如下面这一种：
帧头 帧类型 数据长度 数据 校验 帧尾 A5 5A AA 55 1 byte 1 byte n byte XOR 0D 0A 0D 0A 一般 HEX 协议的数据流都类似这种，或者是它的变种。这些数据可以通过 UART、网口、蓝牙、2.4G、SPI 等等等等进行传输。简单点，我们就串口而言，解析方式大致有两种。
一种是利用串口空闲中断，逐帧接收处理。这种方式最简单，CPU 开销也小，但不是每一种 MCU 都有可靠的串口空闲中断。另外，发送过程中还可能出现黏包，比如网口通信时由于网络延迟，几帧数据会一起收到。
另一种就是本文要实现的：把收到的数据先丢进环形缓冲区，再逐字节匹配并解析。它不怕拆包，也不怕多帧一起到达；配合 DMA 或接收缓冲区使用，CPU 开销也还能接受，只是代码写起来稍微麻烦一点。
于是本文应运而生。直接用这个模块，几分钟就能把协议接收部分搭起来~~~
二、实现思路 简单的才是稳定好用的。这个模块要足够容易移植，如果是我用，我最关心的主流程只有下面几件事：
初始化：把帧头、帧尾、长度计算方式、校验方式和缓冲区告诉解析器。 放入数据：UART、SPI 或网口收到多少数据，就往解析器里放多少。 获取完整帧：在主循环或任务中轮询，解析器自己完成同步、组帧、帧尾匹配和校验。 提供心跳：通常每 1 ms 调用一次，让异常帧能够通过空闲超时恢复。 1、提取协议共性 要把一帧数据完整提取出来，首先需要匹配帧头；然后要知道完整帧长，才能判断数据是否收齐并找到帧尾；最后再对整帧进行校验。</description></item></channel></rss>