Files
433_STM32/Core/Inc/cmd_parser.h
zhongxuanzhen 71027ebc46 3.27_433:添加UART2调试打印、IO监控、指令解析和继电器控制模块。
能够接收UART2指令控制继电器开关,或向UART2发送四路IO输入状态,并使用轮询方式检测IO状态进行及时反馈。
2026-03-27 10:09:13 +08:00

110 lines
2.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file cmd_parser.h
* @brief ASCII指令解析模块头文件
* @author Application Layer
* @version 1.0
******************************************************************************
* @attention
* 本模块实现ASCII文本指令的解析和处理
* 指令格式: $CMD,param1,param2*CS\r\n
* 支持异或校验FF为调试特权后门
* 包含完善的安全防护机制
******************************************************************************
*/
#ifndef __CMD_PARSER_H
#define __CMD_PARSER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#define CMD_MAX_LEN 8
#define PARAM_MAX_LEN 32
#define PARSE_TIMEOUT_MS 1000
typedef enum {
CMD_CODE_UNKNOWN = 0,
CMD_CODE_RL = 1,
CMD_CODE_DI = 2,
CMD_CODE_ECHO = 3,
CMD_CODE_FWD = 4
} cmd_code_t;
typedef struct {
char cmd[CMD_MAX_LEN];
char param1[PARAM_MAX_LEN];
char param2[PARAM_MAX_LEN];
uint8_t received_cs;
uint8_t calculated_cs;
bool valid;
bool skip_checksum;
} cmd_frame_t;
/**
* @brief 初始化指令解析模块
* @note 重置解析状态机,清空缓冲区
* @param 无
* @retval 无
*/
void CmdParser_Init(void);
/**
* @brief 指令解析任务处理函数
* @note 在主循环中调用,处理已接收的完整指令帧
* @param 无
* @retval 无
*/
void CmdParser_Task(void);
/**
* @brief 喂入单字节数据到解析器
* @note 通常在UART接收中断中调用
* @param byte: 接收到的字节数据
* @param current_tick: 当前系统tick用于超时检测
* @retval 无
*/
void CmdParser_FeedByte(uint8_t byte, uint32_t current_tick);
/**
* @brief 检查是否有完整的指令帧
* @note 用于查询解析状态
* @param frame: 输出参数,存储解析结果
* @retval true: 有完整帧, false: 无
*/
bool CmdParser_HasCompleteFrame(cmd_frame_t *frame);
/**
* @brief 确认指令已处理
* @note 处理完指令后调用,重置解析器
* @param 无
* @retval 无
*/
void CmdParser_Acknowledge(void);
/**
* @brief 获取解析错误计数
* @note 用于调试和诊断
* @param 无
* @retval 错误计数
*/
uint32_t CmdParser_GetErrorCount(void);
/**
* @brief 获取接收到的有效指令计数
* @note 用于调试和诊断
* @param 无
* @retval 有效指令计数
*/
uint32_t CmdParser_GetValidCount(void);
#ifdef __cplusplus
}
#endif
#endif