3.27_433:实验并验证485发送数据透传至RF433模块,并在外部设备成功接收
- 新增协议识别器状态机,实现指令与透传数据的自动识别
This commit is contained in:
207
Core/Inc/uart3_passthrough.h
Normal file
207
Core/Inc/uart3_passthrough.h
Normal 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
|
||||
150
Core/Inc/uart3_protocol_discriminator.h
Normal file
150
Core/Inc/uart3_protocol_discriminator.h
Normal 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
|
||||
143
Core/Inc/uart3_smart_router_config.h
Normal file
143
Core/Inc/uart3_smart_router_config.h
Normal 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@9600bps,1字节≈1.04ms,50ms≈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
|
||||
Reference in New Issue
Block a user