3.27_433:实验并验证485发送数据透传至RF433模块,并在外部设备成功接收

- 新增协议识别器状态机,实现指令与透传数据的自动识别
This commit is contained in:
2026-03-27 19:58:20 +08:00
parent 268667e335
commit 0eea5c1424
71 changed files with 6051 additions and 2620 deletions

View File

@ -0,0 +1,207 @@
/**
******************************************************************************
* @file uart3_passthrough.h
* @brief UART3透传引擎模块头文件
* @author Application Layer
* @version 1.0
******************************************************************************
* @attention
* 设计依据UART3智能数据路由与透传功能开发计划 第3.2节
*
* 功能说明:
* 本模块实现透传数据缓冲与发送功能将UART3接收的透传数据转发至UART1
*
* 数据结构严格按文档3.2.2节定义):
* - passthrough_node_t: 透传数据节点
* - passthrough_queue_t: 透传队列
* - passthrough_context_t: 透传引擎上下文
*
* 配置参数严格按附录D定义
* - PASSTHROUGH_NODE_SIZE: 128字节
* - PASSTHROUGH_MAX_NODES: 4个节点
* - PASSTHROUGH_TOTAL_BUFFER: 512字节
******************************************************************************
*/
#ifndef __UART3_PASSTHROUGH_H
#define __UART3_PASSTHROUGH_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
/*==============================================================================
* 透传引擎配置参数
* 设计依据文档附录D配置参数
*============================================================================*/
/**
* @brief 每个透传节点大小
*/
#ifndef PASSTHROUGH_NODE_SIZE
#define PASSTHROUGH_NODE_SIZE 128
#endif
/**
* @brief 最大节点数量
*/
#ifndef PASSTHROUGH_MAX_NODES
#define PASSTHROUGH_MAX_NODES 4
#endif
/**
* @brief 发送缓冲区总大小
*/
#ifndef PASSTHROUGH_TOTAL_BUFFER
#define PASSTHROUGH_TOTAL_BUFFER (PASSTHROUGH_NODE_SIZE * PASSTHROUGH_MAX_NODES)
#endif
/*==============================================================================
* 透传数据节点结构体
* 设计依据文档第3.2.2节核心数据结构
*============================================================================*/
/**
* @brief 透传数据节点
* @note 每个节点存储一段待发送的透传数据
*/
typedef struct {
uint8_t data[PASSTHROUGH_NODE_SIZE]; /**< 数据缓冲区 */
uint16_t length; /**< 有效数据长度 */
uint16_t offset; /**< 已发送偏移 */
bool valid; /**< 节点是否有效 */
} passthrough_node_t;
/*==============================================================================
* 透传队列结构体
* 设计依据文档第3.2.2节核心数据结构
*============================================================================*/
/**
* @brief 透传队列
* @note 管理多个透传数据节点的FIFO队列
*/
typedef struct {
passthrough_node_t nodes[PASSTHROUGH_MAX_NODES]; /**< 节点数组 */
uint8_t write_index; /**< 写入位置 */
uint8_t read_index; /**< 读取位置 */
volatile uint16_t pending_count; /**< 待发送字节总数 */
} passthrough_queue_t;
/*==============================================================================
* 透传统计结构体
* 设计依据文档第3.2.1节模块接口设计
*============================================================================*/
/**
* @brief 透传统计信息
* @note 记录透传引擎的运行状态
*/
typedef struct {
uint32_t total_bytes_sent; /**< 累计发送字节数 */
uint32_t total_packets; /**< 累计发送数据包数 */
uint32_t overflow_count; /**< 缓冲区溢出次数 */
uint32_t busy_count; /**< UART1忙等待次数 */
} passthrough_stats_t;
/*==============================================================================
* 透传引擎上下文结构体
* 设计依据文档第3.2.2节核心数据结构
*============================================================================*/
/**
* @brief 透传引擎上下文
* @note 保存透传引擎全部状态信息
*/
typedef struct {
passthrough_queue_t queue; /**< 透传队列 */
passthrough_stats_t stats; /**< 透传统计 */
bool initialized; /**< 初始化标志 */
} passthrough_context_t;
/*==============================================================================
* 全局变量声明
* 设计依据文档第3.2.2节
*============================================================================*/
extern passthrough_context_t g_passthrough_ctx;
/*==============================================================================
* 函数接口声明
* 设计依据文档第3.2.1节模块接口设计
*============================================================================*/
/**
* @brief 透传引擎初始化
* @note 初始化透传队列和统计信息
* @param 无
* @retval 无
*/
void Passthrough_Init(void);
/**
* @brief 压入单字节到透传缓冲区
* @note 将单个字节添加到透传发送队列
* @param byte: 待发送字节
* @retval bool: true=成功false=缓冲区满
*/
bool Passthrough_PushByte(uint8_t byte);
/**
* @brief 压入数据块到透传缓冲区
* @note 将数据块添加到透传发送队列
* @param data: 数据缓冲区指针
* @param length: 数据长度
* @retval uint16_t: 实际写入的字节数
*/
uint16_t Passthrough_PushBuffer(const uint8_t *data, uint16_t length);
/**
* @brief 透传引擎任务
* @note 在主循环中周期性调用,每次尝试发送一个字节
* @param 无
* @retval 无
*/
void Passthrough_Task(void);
/**
* @brief UART1发送完成回调
* @note 应在HAL_UART_TxCpltCallback中调用触发下一次发送
* @param 无
* @retval 无
*/
void Passthrough_OnTxComplete(void);
/**
* @brief 检查UART1是否可发送
* @note 检查UART1发送缓冲区是否有空间
* @param 无
* @retval bool: true=可发送false=忙
*/
bool Passthrough_CanSend(void);
/**
* @brief 获取透传统计信息
* @note 获取透传引擎的运行统计
* @param stats: 统计结构指针
* @retval 无
*/
void Passthrough_GetStats(passthrough_stats_t *stats);
/**
* @brief 重置统计信息
* @note 清零所有统计计数器
* @param 无
* @retval 无
*/
void Passthrough_ResetStats(void);
/**
* @brief 获取待发送字节数
* @note 获取队列中等待发送的字节总数
* @param 无
* @retval uint16_t: 待发送字节数
*/
uint16_t Passthrough_GetPendingCount(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,150 @@
/**
******************************************************************************
* @file uart3_protocol_discriminator.h
* @brief UART3协议识别器模块头文件
* @author Application Layer
* @version 1.0
******************************************************************************
* @attention
* 设计依据UART3智能数据路由与透传功能开发计划 第3.1节
*
* 功能说明:
* 本模块实现UART3协议识别器用于判断接收数据是ASCII指令还是透传数据
*
* 状态机:
* - INIT: 系统启动/复位状态,等待第一个字节
* - SCAN: 扫描模式,等待指令起始符'$'或透传判定
* - CMD_MODE: 指令解析模式数据喂给CmdParser
* - EXEC: 指令执行模式
* - PASSTHROUGH: 透传模式数据转发至UART1
*
* 识别策略:
* - 以'$'开头视为指令候选
* - 超时(50ms)无'$'则判定为透传
* - 帧间隔检测('\n'后重新判断)
******************************************************************************
*/
#ifndef __UART3_PROTOCOL_DISCRIMINATOR_H
#define __UART3_PROTOCOL_DISCRIMINATOR_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
/*==============================================================================
* 路由结果枚举定义
* 设计依据文档第3.1.2节伪代码
*============================================================================*/
/**
* @brief 路由结果枚举
* @note 定义协议识别器的三种路由结果
*/
typedef enum {
ROUTE_NONE = 0, /**< 暂时缓存,不路由 */
ROUTE_CMD, /**< 路由至指令解析器 */
ROUTE_PASSTHROUGH /**< 路由至透传引擎 */
} route_result_t;
/*==============================================================================
* 协议识别器状态枚举定义
* 设计依据文档第3.1.1节状态转换图
*============================================================================*/
/**
* @brief 协议识别器状态枚举
* @note 定义状态机的所有状态
*/
typedef enum {
STATE_INIT = 0, /**< 初始状态,系统启动/复位 */
STATE_SCAN, /**< 扫描模式,等待指令起始符或透传判定 */
STATE_CMD_MODE, /**< 指令解析模式 */
STATE_EXEC, /**< 指令执行模式 */
STATE_PASSTHROUGH /**< 透传模式 */
} protocol_state_t;
/*==============================================================================
* 协议识别器上下文结构体
* 设计依据文档第3.1.2节伪代码
*============================================================================*/
/**
* @brief UART3协议识别器上下文
* @note 保存状态机全部状态信息
*/
typedef struct {
protocol_state_t state; /**< 当前状态 */
uint32_t last_byte_tick; /**< 上次收到字节的时间 */
uint32_t scan_start_tick; /**< SCAN状态开始时间 */
uint8_t scan_buffer[128]; /**< SCAN状态缓存 */
uint16_t scan_length; /**< SCAN缓存长度 */
bool pending_cmd; /**< CMD_MODE是否有待处理帧 */
uint32_t passthrough_bytes; /**< 透传字节计数 */
} uart3_protocol_context_t;
/*==============================================================================
* 全局变量声明
* 设计依据文档第3.1.2节伪代码
*============================================================================*/
extern uart3_protocol_context_t g_uart3_proto_ctx;
/*==============================================================================
* 函数接口声明
* 设计依据文档第3.1.3节接口定义
*============================================================================*/
/**
* @brief 协议识别器初始化
* @note 初始化状态机和上下文
* @param 无
* @retval 无
*/
void UART3_Protocol_Init(void);
/**
* @brief 协议识别器字节输入
* @note 由UART3中断调用判断字节应该走指令路径还是透传路径
* @param byte: 接收字节
* @param current_tick: 当前系统时间(ms)
* @retval route_result_t: 路由结果 (ROUTE_CMD/ROUTE_PASSTHROUGH/ROUTE_NONE)
*/
route_result_t UART3_Protocol_FeedByte(uint8_t byte, uint32_t current_tick);
/**
* @brief 协议识别器超时检查
* @note 定时调用检查SCAN状态是否超时
* @param current_tick: 当前系统时间(ms)
* @retval bool: true=触发了透传false=继续等待
*/
bool UART3_Protocol_CheckTimeout(uint32_t current_tick);
/**
* @brief 获取透传模式下的缓存数据
* @note 在触发透传后调用,获取待发送的透传数据
* @param buffer: 输出缓冲区指针
* @param length: 数据长度指针(输出)
* @retval bool: true=有数据false=无数据
*/
bool UART3_Protocol_GetPassthroughData(uint8_t *buffer, uint16_t *length);
/**
* @brief 获取当前协议识别状态
* @note 用于调试和状态监控
* @param 无
* @retval uint8_t: 当前状态码
*/
uint8_t UART3_Protocol_GetState(void);
/**
* @brief 重置协议识别器状态
* @note 将状态机恢复到INIT状态
* @param 无
* @retval 无
*/
void UART3_Protocol_Reset(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,143 @@
/**
******************************************************************************
* @file uart3_smart_router_config.h
* @brief UART3智能路由与透传功能配置文件
* @author Application Layer
* @version 1.0
******************************************************************************
* @attention
* 设计依据UART3智能数据路由与透传功能开发计划 附录D
*
* 配置说明:
* 本文件定义所有可配置的参数,包括协议识别器、透传引擎和调试开关
*
* 修改说明:
* 如需调整功能行为,只需修改本文件中的宏定义,无需改动业务代码
******************************************************************************
*/
#ifndef __UART3_SMART_ROUTER_CONFIG_H
#define __UART3_SMART_ROUTER_CONFIG_H
/*==============================================================================
* 协议识别器配置参数
* 设计依据文档第3.1节
*============================================================================*/
/**
* @brief SCAN状态超时时间(ms)
* @note UART3@9600bps1字节≈1.04ms50ms≈48字节
* 用于判断非指令数据何时转为透传
*/
#ifndef SCAN_TIMEOUT_MS
#define SCAN_TIMEOUT_MS 50
#endif
/**
* @brief SCAN缓存大小(字节)
* @note 建议不小于最大指令长度
*/
#ifndef SCAN_BUFFER_SIZE
#define SCAN_BUFFER_SIZE 128
#endif
/**
* @brief 指令帧完整接收超时(ms)
* @note 收到'$'后,等待完整帧(\r\n)的超时时间
*/
#ifndef CMD_COMPLETE_TIMEOUT_MS
#define CMD_COMPLETE_TIMEOUT_MS 200
#endif
/*==============================================================================
* 透传引擎配置参数
* 设计依据文档第3.2节
*============================================================================*/
/**
* @brief 每个透传节点大小(字节)
* @note 单次透传数据块的最大长度
*/
#ifndef PASSTHROUGH_NODE_SIZE
#define PASSTHROUGH_NODE_SIZE 128
#endif
/**
* @brief 最大节点数量
* @note 透传缓冲区可存储的数据块数量
*/
#ifndef PASSTHROUGH_MAX_NODES
#define PASSTHROUGH_MAX_NODES 4
#endif
/**
* @brief 发送缓冲区总大小(字节)
* @note = PASSTHROUGH_NODE_SIZE * PASSTHROUGH_MAX_NODES
*/
#ifndef PASSTHROUGH_TOTAL_BUFFER
#define PASSTHROUGH_TOTAL_BUFFER (PASSTHROUGH_NODE_SIZE * PASSTHROUGH_MAX_NODES)
#endif
/*==============================================================================
* 功能开关配置
* 设计依据文档第3.3节
*============================================================================*/
/**
* @brief UART3智能路由模式使能开关
* @note 1=启用智能路由(协议识别+透传)0=原有逻辑(所有数据给CmdParser)
* 可通过此开关快速切换新旧逻辑
*/
#ifndef UART3_SMART_ROUTING_ENABLED
#define UART3_SMART_ROUTING_ENABLED 1
#endif
/**
* @brief 透传日志输出使能开关
* @note 1=启用透传相关日志0=禁用
* 禁用后可减少日志输出,提升性能
*/
#ifndef PASSTHROUGH_LOG_ENABLED
#define PASSTHROUGH_LOG_ENABLED 1
#endif
/*==============================================================================
* 调试配置参数
* 设计依据文档第3.1.2节、3.2.3节
*============================================================================*/
/**
* @brief 协议识别器调试开关
* @note 1=启用调试日志0=禁用
* 启用后会输出状态转换和路由判定日志
*/
#ifndef DEBUG_PROTOCOL_DISCRIMINATOR
#define DEBUG_PROTOCOL_DISCRIMINATOR 1
#endif
/**
* @brief 透传引擎调试开关
* @note 1=启用调试日志0=禁用
* 启用后会输出发送进度和缓冲区状态日志
*/
#ifndef DEBUG_PASSTHROUGH_ENGINE
#define DEBUG_PASSTHROUGH_ENGINE 1
#endif
/*==============================================================================
* 背压控制参数
* 设计依据文档第3.3.3节透传引擎发送接口
*============================================================================*/
/**
* @brief 缓冲区满警告阈值(字节)
* @note 当pending_count超过此值时记录警告日志
*/
#ifndef PASSTHROUGH_WARNING_THRESHOLD
#define PASSTHROUGH_WARNING_THRESHOLD 200
#endif
/**
* @brief 每次任务调用的最大发送字节数
* @note 限制每次调用发送的字节数避免长时间占用CPU
*/
#ifndef PASSTHROUGH_MAX_SEND_PER_CALL
#define PASSTHROUGH_MAX_SEND_PER_CALL 16
#endif
#endif