feat: 添加协议处理和校验和计算功能,更新 UART 相关代码
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
#include "bsp_uart.h"
|
||||
#include "checksum.h"
|
||||
#include "elog.h"
|
||||
#include "protocol.h"
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* @brief 使用 UART1 和 DMA 发送数据到 ESP12F 模块(用于 TCP 透传)
|
||||
@@ -7,28 +11,27 @@
|
||||
* @return HAL_StatusTypeDef: HAL_OK 表示成功,其他值表示失败
|
||||
*/
|
||||
HAL_StatusTypeDef ESP12F_TCP_SendMessage(const char *data) {
|
||||
if (data == NULL) {
|
||||
return HAL_ERROR; // 参数无效
|
||||
}
|
||||
if (data == NULL) {
|
||||
return HAL_ERROR; // 参数无效
|
||||
}
|
||||
|
||||
// 计算数据大小
|
||||
uint16_t size = strlen(data);
|
||||
if (size == 0) {
|
||||
return HAL_ERROR; // 数据为空
|
||||
}
|
||||
// 计算数据大小
|
||||
uint16_t size = strlen(data);
|
||||
if (size == 0) {
|
||||
return HAL_ERROR; // 数据为空
|
||||
}
|
||||
|
||||
// 启动 DMA 传输
|
||||
return HAL_UART_Transmit_DMA(&huart1, (uint8_t *)data, size);
|
||||
// 启动 DMA 传输
|
||||
return HAL_UART_Transmit_DMA(&huart1, (uint8_t *)data, size);
|
||||
}
|
||||
|
||||
|
||||
/* External DMA handle */
|
||||
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||
|
||||
/* DMA 接收缓冲区及状态变量 */
|
||||
uint8_t uart1_rx_buf[UART1_RX_BUF_SIZE];
|
||||
volatile uint16_t uart1_rx_len = 0; /* 记录最近一次接收到的数据包长度 */
|
||||
volatile uint8_t uart1_rx_flag = 0; /* 接收完成标志位:1表示有一帧新数据 */
|
||||
uint8_t uart1_rx_buf[UART1_RX_BUF_SIZE];
|
||||
volatile uint16_t uart1_rx_len = 0; /* 记录最近一次接收到的数据包长度 */
|
||||
volatile uint8_t uart1_rx_flag = 0; /* 接收完成标志位:1表示有一帧新数据 */
|
||||
|
||||
/**
|
||||
* @brief 初始化 UART1 并启动 DMA 接收
|
||||
@@ -38,14 +41,13 @@ volatile uint8_t uart1_rx_flag = 0; /* 接收完成标志位:1表示
|
||||
* @return 无
|
||||
* @note 需要在调用此函数前确保 UART1 和 DMA 已经正确初始化
|
||||
*/
|
||||
void BSP_UART1_Init(void)
|
||||
{
|
||||
void BSP_UART1_Init(void) {
|
||||
/* 停止并重置 DMA 状态 */
|
||||
HAL_UART_DMAStop(&huart1);
|
||||
HAL_UART_DMAStop(&huart1);
|
||||
uart1_rx_len = 0;
|
||||
uart1_rx_flag = 0;
|
||||
memset(uart1_rx_buf, 0, sizeof(uart1_rx_buf));
|
||||
|
||||
|
||||
/* 启动 DMA 接收,将接收到的数据存储到 uart1_rx_buf 缓冲区 */
|
||||
HAL_UART_Receive_DMA(&huart1, uart1_rx_buf, UART1_RX_BUF_SIZE);
|
||||
|
||||
@@ -66,7 +68,7 @@ void UART_IDLE_Callback(UART_HandleTypeDef *huart) {
|
||||
|
||||
/* 清除空闲中断标志位(HAL库宏) */
|
||||
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
||||
|
||||
|
||||
/* 停止 DMA 以便安全读取计数器并更新状态 */
|
||||
HAL_UART_DMAStop(huart);
|
||||
|
||||
@@ -75,13 +77,13 @@ void UART_IDLE_Callback(UART_HandleTypeDef *huart) {
|
||||
|
||||
if (recv_len > 0 && recv_len < UART1_RX_BUF_SIZE) {
|
||||
uart1_rx_len = recv_len;
|
||||
uart1_rx_buf[recv_len] = '\0'; /* 添加字符串结束符,方便后续字符串处理 */
|
||||
uart1_rx_flag = 1; /* 置位标志,通知应用层新消息到达 */
|
||||
|
||||
/* 仅供调试:在中断中打印接收到的数据(注意:printf 可能会影响实时性) */
|
||||
elog_raw("UART1 Received: %s\r\n", (char *)uart1_rx_buf);
|
||||
uart1_rx_buf[recv_len] = '\0'; /* 添加字符串结束符,方便后续字符串处理 */
|
||||
uart1_rx_flag = 1; /* 置位标志,通知应用层新消息到达 */
|
||||
|
||||
// 调用协议处理函数,通过消息队列发送接收到的数据
|
||||
Protocol_HandleMessage(uart1_rx_buf, recv_len);
|
||||
}
|
||||
|
||||
/* 重新启动新一轮的 DMA 接收 */
|
||||
HAL_UART_Receive_DMA(&huart1, uart1_rx_buf, UART1_RX_BUF_SIZE);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user