generated from hulk/gd32f4xx_template_cmake_vscode
Port command protocol framework from E23x (RS485 data link)
This commit is contained in:
+1
-1
@@ -28,7 +28,7 @@
|
||||
/* >>>>>>>>>>>>>>>>>>>>[COMMAND DEBUG]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
#define COM_DEBUG CFG_DISABLE // CFG_DISABLE: Command debug off; CFG_ENABLE: Command debug on
|
||||
/* TODO: 串口命令协议模块(command.c)尚未移植(见 AGENTS.md 进度清单) */
|
||||
/* 命令协议框架已移植(Src/command.c,数据口 RS485),业务命令待定义 */
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[DEBUG ASSERTIONS DEFINE]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
* @file command.h
|
||||
* @brief 串口命令解析与处理模块接口声明(FilmForge:数据口走 RS485)。
|
||||
* @details 提供基于环形缓冲区的串口协议解析、命令处理及状态管理功能,
|
||||
* 支持格式为 D5 BOARD_TYPE LEN [cmd] CRC 的命令帧解析与响应。
|
||||
*/
|
||||
#ifndef COMMAND_H
|
||||
#define COMMAND_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/**
|
||||
* @defgroup Command 命令处理模块
|
||||
* @brief 串口命令解析与处理
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @section Command_Protocol 协议格式
|
||||
* 接收命令帧格式(经 RS485 数据口):
|
||||
* @code
|
||||
* [0] HEADER = 0xD5 // 包头标识
|
||||
* [1] BOARD_TYPE // 板卡类型标识
|
||||
* [2] LEN = 数据区字节数 // 有效载荷长度
|
||||
* [3..(3+LEN-1)] 数据 // 命令数据,如 "M999"
|
||||
* [last] CRC // 校验码(从索引1累加到len-2的低8位)
|
||||
* @endcode
|
||||
*
|
||||
* 响应帧格式:
|
||||
* @code
|
||||
* [0] HEADER = 0xB5 // 响应包头
|
||||
* [1] TYPE // 响应类型(0xF0=成功,0xF1..=错误类型)
|
||||
* [2] LEN // 响应数据长度
|
||||
* [3..(3+LEN-1)] 数据 // 响应数据
|
||||
* [last] CRC // 校验码
|
||||
* @endcode
|
||||
*
|
||||
* @section Command_Usage 使用说明
|
||||
* 1) 初始化 RS485 数据口:
|
||||
* @code{.c}
|
||||
* rs485_init();
|
||||
* @endcode
|
||||
*
|
||||
* 2) 在主循环中调用命令处理:
|
||||
* @code{.c}
|
||||
* while(1) {
|
||||
* command_process(); // 处理 RS485 接收到的命令
|
||||
* // 其他业务逻辑
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief 处理 RS485 接收环形缓冲区中的命令数据。
|
||||
* @details 基于状态机的非阻塞协议解析器,处理完整的命令帧并自动响应。
|
||||
* 每次调用处理缓冲区中所有可用数据,遇到错误时自动重置状态机。
|
||||
* @note 使用静态变量维护解析状态,函数不可重入。
|
||||
* @warning 依赖 RS485 接收环形缓冲区正确实现,建议在主循环中周期调用。
|
||||
* @ingroup Command
|
||||
*/
|
||||
void command_process(void);
|
||||
|
||||
/**
|
||||
* @brief 解析并处理完整的命令帧。
|
||||
* @param frame 指向完整命令帧的缓冲区(从包头0xD5开始)。
|
||||
* @param len 命令帧总长度(字节)。
|
||||
* @note 内部函数,由 command_process() 调用,一般不直接使用。
|
||||
* @ingroup Command
|
||||
*/
|
||||
void handle_command(const uint8_t *frame, uint8_t len);
|
||||
|
||||
/**
|
||||
* @brief 执行命令(简化版,调试用)。
|
||||
* @details 根据命令字符串直接构造协议帧并执行,无需手动构造协议帧
|
||||
* @param cmd_str 命令字符串(如"M999"、"M888")
|
||||
* @note 简化的测试函数,自动处理协议帧构造、CRC计算和命令执行
|
||||
* @ingroup Command
|
||||
*/
|
||||
void command_execute(const char *cmd_str);
|
||||
|
||||
/** @} */ // end of Command group
|
||||
|
||||
#endif // COMMAND_H
|
||||
+6
-7
@@ -23,13 +23,6 @@ void rs485_init(void);
|
||||
*/
|
||||
void rs485_send(const uint8_t *data, uint16_t len);
|
||||
|
||||
/**
|
||||
* @brief RS485 主循环处理(拉通阶段:原样回显)。
|
||||
* @details 从接收环形缓冲取字节并回发到 RS485,同时转发到 debug 串口。
|
||||
* 在主循环中周期调用。
|
||||
*/
|
||||
void rs485_process(void);
|
||||
|
||||
/**
|
||||
* @brief 获取当前 RS485 接收环形缓冲区可读字节数。
|
||||
*/
|
||||
@@ -41,6 +34,12 @@ uint8_t rs485_rx_available(void);
|
||||
*/
|
||||
int rs485_rx_get(void);
|
||||
|
||||
/**
|
||||
* @brief 清空 RS485 接收环形缓冲区(丢弃已接收数据)。
|
||||
* @note 内部关中断保护,与 ISR 无竞争。
|
||||
*/
|
||||
void rs485_rx_clear(void);
|
||||
|
||||
/**
|
||||
* @brief USART0 接收中断处理(由 gd32f4xx_it.c 的 USART0_IRQHandler 调用)。
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user