STM32 串口实现不定长数据接收(亲测有效,附代码)

STM32CubeMX配置

1. 将串口设置为异步通信,波特率根据个人情况而定

在这里插入图片描述

2. 设置串口DMA接收

在这里插入图片描述

3. 打开串口中断

在这里插入图片描述

代码添加

1. 使能中断并开启接收

串口初始化完成后添加如下代码:

//使能接收中断和空闲中断并打开DMA接收
 __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
 __HAL_UART_CLEAR_IDLEFLAG(&huart1);
 HAL_UART_Receive_DMA(&huart1, usart1_recv, RECV_SIZE);

2. 编写中断服务函数

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  if(RESET != __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) //判读是否触发空闲中断
  {
    uint16_t temp = 0;
    __HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除空闲中断标志位
    HAL_UART_DMAStop(&huart1); //关闭MDA
    
    //以下两行用来清除中断,软件清除空闲中断先读SR后读DR
    temp = huart1.Instance->SR; //清除SR状态寄存器
    temp = huart1.Instance->DR; //读取DR数据寄存器
    uint8_t data_length  = RECV_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //获取接收的数据长度
    printf("Receive Data length = %d\r\n",data_length);
    printf("Receive Data:%s\r\n", usart1_recv);
    memset(usart1_recv, 0, RECV_SIZE);
  }
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  HAL_UART_Receive_DMA(&huart1, usart1_recv, RECV_SIZE); //重新打开DMA接收
  /* USER CODE END USART1_IRQn 1 */
}

在这里插入图片描述

实验结果

在这里插入图片描述

代码链接: link.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值