cubemx串口不定长数据收发
时间: 2025-01-03 18:22:45 浏览: 16
### 使用STM32 CubeMX配置串口进行不定长数据的接收与发送
#### 配置环境准备
为了实现基于STM32CubeMX的串口DMA和空闲中断功能,需先准备好开发环境。确保安装了最新版本的STM32CubeMX以及相应的IDE工具链(如Keil MDK或TrueSTUDIO)。此外,还需下载并熟悉官方提供的示例工程[^1]。
#### STM32CubeMX初始化设置
打开STM32CubeMX软件,在项目创建向导中选择目标MCU型号。进入主界面后,找到`Connectivity`标签页下的UART外设模块,并双击开启其配置窗口。在此处勾选启用DMA控制器选项,并指定用于接收操作的具体通道号;对于发送部分同样如此处理。接着切换到NVIC中断优先级管理页面,激活USART全局中断事件以便后续能够响应外部信号触发的动作[^2]。
#### 定义结构体变量存储接收到的信息
在应用程序源码文件内声明一个自定义类型的全局对象实例UsartType1,该类型包含了若干成员属性用来追踪当前状态机的工作情况,比如是否有新的帧到达标志位receive_flag、缓冲区实际占用字节数rx_len等字段。这些信息将在ISR服务例程内部被更新维护以反映最新的硬件活动状况[^3]:
```c
/* usart.h */
typedef struct {
uint8_t receive_flag : 1;
uint8_t dmaSend_flag : 1;
uint16_t rx_len;
uint8_t usartDMA_rxBuf[RECEIVELEN];
} USART_RECEIVETYPE;
extern USART_RECEIVETYPE UsartType1;
```
#### 编写回调函数处理逻辑流程控制
当检测到线路处于低电平超过一定时间间隔即认为一帧结束,则会调用对应的IDLE线程入口点执行相应动作序列。此时应重置计数器并将捕获到的有效载荷复制给上层协议栈进一步解析处理。同时也要注意防止溢出错误的发生,因此建议设定合理的最大允许长度限制值以免造成不必要的麻烦:
```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USARTx){ // Replace with your actual instance name.
__HAL_DMA_DISABLE(&hdma_usart_rx);
UsartType1.receive_flag = 1;
UsartType1.rx_len = huart->RxXferSize - __HAL_DMA_GET_COUNTER(&hdma_usart_rx);
/* Process received data here */
__HAL_UART_FLUSH_DRREGISTER(huart);
__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
__HAL_DMA_CLEAR_FLAG(&hdma_usart_rx,DMA_FLAG_TCIF4|DMA_FLAG_HTIF4|DMA_FLAG_TEIF4);
__HAL_DMA_ENABLE(&hdma_usart_rx);
}
}
```
#### 发送过程中的注意事项
针对消息传递环节而言,考虑到可能存在的并发访问冲突风险因素影响整体性能表现,所以在每次发起新请求之前务必确认前一次事务已经顺利完成再继续下一步骤的操作。可以通过轮询方式查询特定寄存器的状态位得知确切的结果反馈,或者借助于前面提到过的dmaSend_flag布尔量来进行同步协调工作。
阅读全文