嵌入式开发--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;
    }
相关推荐
三易串口屏7 小时前
实验2 实时显示单片机的参数(整数、小数、中文 自定义协议方式)
单片机·物联网·mongodb·自动化·串口屏·医疗器械·工控设备
╰⋛⋋⊱⋋翅膀⋌⊰⋌⋚╯7 小时前
FreeRTOS--CPU利用率
stm32·freertos
高速上的乌龟8 小时前
Lattice LFCPNX-100 HSB+Fpga开发详解: MAC+PCS以太网SFP光口传输
单片机·嵌入式硬件·fpga开发
易水寒陈8 小时前
单片机的hardfault打印信息定位错误
单片机
振浩微433射频芯片8 小时前
告别“遥控失灵”:如何评估国产433芯片在智能家居领域的可靠性?
网络·单片机·嵌入式硬件·物联网·智能家居
互联科技报8 小时前
极海APM32F427高性能MCU赋能中高端PLC,筑牢工业自动化控制核心
单片机·嵌入式硬件·自动化
天天爱吃肉82189 小时前
新能源汽车测试工程师工作笔记:VCU输出PWM波常见问题排查
笔记·功能测试·嵌入式硬件·汽车
0南城逆流09 小时前
【网站分享】常用网站分享三:STM32常用模块链接
stm32·单片机·嵌入式硬件
星夜夏空9910 小时前
STM32单片机学习(17) —— 串口外设中断
stm32·单片机·学习