通信协议的报文解析过程可通过标准化封装实现高效统一的处理体系,其核心在于抽象共性规律并建立可配置的解析框架。
一、报文格式共性规律分析
二、通用解析框架设计原则
三、核心模块实现方案
/**
* @file mx_frame_parser.h
* @brief 通用数据帧解析器配置结构定义
* @note 支持可变帧头、长度字段位置和大端/小端处理
*/
#define HEAD_MAXLEN 10 ///< 帧头最大支持长度
/**
* @brief 帧头比较函数指针类型
* @param buff 待比较缓冲区指针
* @param Data 预期数据指针
* @param DataSize 比较数据长度
* @return 匹配结果:0-不匹配,1-匹配
*/
typedef uint8_t(*mx_framehead_memcmp)(uint8_t* buff, uint8_t* Data, uint8_t DataSize);
/**
* @brief 长度字段字节占用配置
* @note 根据协议规范选择长度字段占用的字节数[1](@ref)
*/
typedef enum {
FRAMELEN_OCCUPANCY_1BYTE = 0, ///< 长度字段占1字节 (0~255)
FRAMELEN_OCCUPANCY_2BYTE = 1, ///< 长度字段占2字节 (0~65535)
FRAMELEN_OCCUPANCY_3BYTE = 2, ///< 长度字段占3字节 (0~16777215)
FRAMELEN_OCCUPANCY_4BYTE = 3, ///< 长度字段占4字节 (0~4294967295)
} framelen_occupancy;
/**
* @brief 长度字段字节序配置
* @note 根据协议规范选择大端或小端格式[3](@ref)
*/
typedef enum {
FRAMELEN_LITTLE_ENDIAN = 0, ///< 小端模式(低位在前)
FRAMELEN_BIG_ENDIAN = 1, ///< 大端模式(高位在前)
} framelen_endian;
/**
* @brief 帧解析器配置结构体
* @note 支持自定义帧格式:帧头(N byte) + 长度字段(1-4 byte) + 数据载荷
*/
typedef struct {
/* 帧头配置 */
uint8_t framehead_code[HEAD_MAXLEN]; ///< 帧头特征码数组
uint8_t framehead_len; ///< 有效帧头字节数
uint8_t framehead_mem; ///< 实际参与比较的字节数(用于模糊匹配)
int8_t framehead_left; ///< 帧头左侧保留字节数(用于变长帧头)
/* 解析状态 */
uint8_t chk_step; ///< 当前解析阶段(0-寻找帧头,1-解析长度,2-获取载荷)
uint16_t loaded_length; ///< 已加载数据长度
uint16_t remainder_length; ///< 剩余待接收数据长度
/* 功能回调 */
mx_framehead_memcmp framehead_memcmp; ///< 自定义帧头比较函数指针
/* 长度字段配置 */
framelen_occupancy occupancy_byte; ///< 长度字段字节数配置
framelen_endian endian_type; ///< 长度字段字节序配置
uint8_t framelen_position; ///< 长度字段相对帧头的偏移量(字节)
uint8_t memcmp_time; ///< 帧头最大匹配尝试次数(防粘包处理)
} mx_frame_parser_config;