嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据--之2

在我之前 的文章 嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据 中,介绍过用DMA+IDLE中断来接收不定长数据,就是利用DMA来接收数据,当一帧传送完成后,总线上出现一个完整的空闲帧的时间长度后,STM32会将IDLE标志置位,并产生一个中断。响应这个中断就可以接收不定长度的一帧了。

现在介绍一个更简单的方法,工作逻辑是一样的,但是更简明些。

HAL_UARTEx_ReceiveToIdle_DMA()函数,其原型如下:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size),使用时需要使能串口中断,并开启IDLE中断

CubeMX中设置如下:

开启中断

设置DMA

然后就是软件

c 复制代码
  HAL_UARTEx_ReceiveToIdle_DMA(&huart3, uart3_rxbuf, UART3_RXBUF_LEN);
  __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);	//开启IDLE中断

最后需要重写回调函数

c 复制代码
// 接收事件回调函数,Size是本次接收到的数据长度
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{    
  u16 i;
  //调试接口uart3收到数据
  if (huart->Instance == USART3) 
  {
    // 1. 停止DMA传输
    HAL_UART_DMAStop(huart);

    // 2. 清除接收缓冲区
    for(i=0; i<Size; i++)
    {
      uart3_rxdata[i] = uart3_rxbuf[i];   //从接收缓冲区提取数据
      uart3_rxbuf[i] = 0;		//这一行可以注释掉,留着它完全是为了调试时看得方便
    }
    // 3. 重新启动接收,DMA指针会自动归零,从头开始接收
    HAL_UARTEx_ReceiveToIdle_DMA(huart, uart3_rxbuf, UART3_RXBUF_LEN);
      
    uart3_rx_len = Size;                      //接收到的数据长度
  }
}

此时,在uart3_rxbuf\[\]中保存的是数据,uart3_rx_len 是长度。

最后在主循环中的处理:

c 复制代码
    //调试接口uart3收到数据
    if(uart3_rx_len != 0)
    {
      //
      
      //做完所有处理之后,将长度清0
      uart3_rx_len = 0;
    }
相关推荐
大爱编程♡1 分钟前
GPIO-I2C
stm32·单片机·嵌入式硬件
振南的单片机世界2 小时前
PVD掉电中断——让单片机“咽气前”写完遗书
arm开发·stm32·单片机·嵌入式硬件
续写烂尾4 小时前
SD NAND存储实测:正点原子STM32精英板SDIO读写验证全流程
stm32·单片机·嵌入式硬件
zlinear数据采集卡6 小时前
USB HS 480M高速传输与SRAM记录仪:DABM-D223数据存储系统全解析
arm开发·嵌入式硬件·fpga开发·开源
wuyk5557 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
Crkylin7 小时前
Cortex-M SysTick系统滴答定时器详解
单片机·嵌入式硬件
Hello_Damon_Nikola7 小时前
AC7911从入门到精通
开发语言·嵌入式硬件·物联网·php
gscsded8 小时前
AUTOSAR CanTp 模块学习笔记
单片机·嵌入式硬件·汽车
Hello_Damon_Nikola8 小时前
扰流筋从原理到应用
人工智能·单片机·嵌入式硬件
某林2128 小时前
从“仿真能跑”到“真机能走”:一套轮腿机械狗强化学习系统的工程化实践
人工智能·stm32·嵌入式硬件·架构·机器人·机械狗