STM32CUBEMX配置USART通过DMA方式接收不定长数据

一、配置STM32cubeMX

二、添加程序

1.main.c中加入

#include "stdio.h"
#define BUFFERSIZE 255            //可以接收的最大字符个数       
uint8_t ReceiveBuff[BUFFERSIZE];  //接收缓冲区
uint8_t recv_end_flag = 0 ,Rx_len;//接收完成中断标志,接收到字符长度
/* USER CODE BEGIN 0 */
void uart1_data(void)
{
	if(recv_end_flag ==1)                //接收完成标志
	{
		printf("数据长度=%d\r\n",Rx_len);  //打印接收到的数据长度 
		printf("数据内容:");
		for(int i=0;i<Rx_len;i++)
		{
			printf("%c",ReceiveBuff[i]);     //向串口打印接收到的数据
    }
    printf("\r\n");     
						
    for(int i = 0; i < Rx_len ; i++)   //清空接收缓存区
    ReceiveBuff[i]=0;                  //置0
    Rx_len=0;                          //接收数据长度清零
    recv_end_flag=0;                   //接收标志位清零
    }
    HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);//开启下一次接收
}
/* USER CODE END 0 */
  /* USER CODE BEGIN 2 */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口1 IDLE中断
	HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
  /* USER CODE END 2 */

在循环中调用uart1_data();

2.stm32f1xx_it.c中加入

/* USER CODE BEGIN TD */
#define BUFFERSIZE 255	//可接收的最大数据量
extern uint8_t recv_end_flag,Rx_len,bootfirst;
/* USER CODE END TD */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	uint32_t temp;
	if(USART1 == huart1.Instance)                         //判断是否为串口1中断
	{      
		if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)== 1) //如果串口1处于空闲状态
		{
			__HAL_UART_CLEAR_IDLEFLAG(&huart1);               //清除中断标志
      HAL_UART_DMAStop(&huart1);                        //停止DMA接收
     	temp= __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);     //获取DMA当前还有多少未填充
      Rx_len = BUFFERSIZE - temp;                       //计算串口接收到的数据个数
      recv_end_flag = 1;                                //接收完成标志
    }
  }
  /* USER CODE END USART1_IRQn 1 */
}

3.usart.c中printf重定向

STM32(keil5)使用printf串口输出(微库法)、usb_printf实现USB虚拟串口输出

三、测试结果

四、例程

STM32CUBEMX配置USART通过DMA方式接收不定长数据icon-default.png?t=N7T8https://download.csdn.net/download/qq_33288274/88860394

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值