前言
此方法利用stm32的uart+dma来实现不定长接收,利用dma中的空闲中断。
设置USART1 为异步通信方式 使能串口1全部中断
设置USART1_RX的DMA中断接收
速度设置最大(其实用115200没有影响 但为保证工程严谨性)
检查中断优先级 这两个中断是否开启
生成代码后
引入头文件
#include "stdio.h"
#include "string.h"
创建变量缓存和引用外部DMA的结构体
extern DMA_HandleTypeDef hdma_usart1_rx;
#define RX_MAXBUFF 64 //接收数组缓存最大值 64
uint8_t rx_buf[RX_MAXBUFF]; //接收缓存
uint8_t rx_sta=0; //接收状态 1:有数据 0:无数据
uint8_t rx_size=0; //接收数据大小
在main函数中 “MX_USART1_UART_Init();”后面加上使能DMA空闲中断和关闭DMA_IT_HT标志位
MX_USART1_UART_Init(); ///这句由自动生成
/* USER CODE BEGIN 2 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf,RX_MAXBUFF*2);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
while循环中用来打印显示收到的数据
while (1)
{
if(rx_sta == 1)
{
rx_sta = 0;
if(rx_size < 64)
printf("rx_size:%d ;rx_buff:%s \r\n",rx_size,rx_buf);
else
printf("rxbuff_overflow!!\r\n");
memset(rx_buf,0,RX_MAXBUFF);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
串口中断函数
/* USER CODE BEGIN 4 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance == USART1)
{
rx_sta = 1;
rx_size = Size;
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf,RX_MAXBUFF*2);
}
}
printf打印函数 同时使MicroLIB库
int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,100); return ch; }