STM32 HAL库 串口DMA接收不定长数据

整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据;串口2我找了一个UBLOX卫星模块,每秒输出不定长的定位信息数据;
首先肯定要先打开串口空闲中断,cubemx里面没有这个空闲中断的开启图形界面,需要自己敲代码打开。
然后开启DMA接收;
最后串口接收到空闲中断标志后会跳进中断函数,然后再进行处理就可以了。



NVIC也顺便改一下,默认是0的话有时候用库自带延时函数会卡死。

main函数
在你的串口初始化后加入两行代码
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
使能串口空闲中断
HAL_UART_Receive_DMA(&huart2, temp, BUFF_SIZE);
这个是把dma接收到的数据放到temp里面,BUFF_SIZE是空间大小,可以在前面宏定义(#define BUFF_SIZE 1024),由于ublox每秒输出的信息比较多,所以缓存开的比较大;
完成上面的步骤,串口接收到数据就进入中断了。由于中断函数里没有空闲中断的处理函数,所以我们要自己在stm32f4xx_it.c文件中加
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */

/* USER CODE END USART2_IRQn 0 /
HAL_UART_IRQHandler(&huart2);
/
USER CODE BEGIN USART2_IRQn 1 /
MY_UART_IDLE_IRQHandler(&huart2);//这个是我们自己定义的空闲中断服务函数
/
USER CODE END USART2_IRQn 1 */
}
然后在main文件里把空闲中断服务函数写出来

void MY_UART_IDLE_IRQHandler(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)
{
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
//清除中断标志
HAL_UART_DMAStop(&huart2);
//停止dma接收
uint16_t DMA_RECEIVE = BUFF_SIZE -__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
计算出接收到的字节数
HAL_UART_Transmit(&huart1, temp, DMA_RECEIVE, 1000);//从串口1将收到的数据发出
memset(temp,0,DMA_RECEIVE);
将缓存区重新初始化
HAL_UART_Receive_DMA(&huart2, temp,BUFF_SIZE);
重新开启DMA接收
}
}
}
需要注意的是,__HAL_DMA_GET_COUNTER(&hdma_usart2_rx)这个函数是表示DMA接收剩余的字节数;我们刚开始的时候开启DMA接收的时候是1024个字节,然后进入空闲中断后,这个函数统计到我们内存还剩XX个字节,也就是说我们实际收到的字节是1024减去内存剩下的字节数。
DMA_RECEIVE这个要根据你实际字节去定义大小,我开始定义的是uint8_t,输出结果怎么都不对,最后发现1024-x这个肯定要大于uint8_t,所以改成了uint16_t。
本人也是刚学习没几天,所以写的很基础,希望能帮到正在学习的人。

STM32 HAL库 串口DMA接收不定长数据相关推荐

  1. 第九章 AT32F403A基于V2库串口 dma接收不定长数据

    目录 概述 硬件 DMA 软件 流程 初始化 初始化代码: 中断服务函数: DMA1通道5设置函数:(重新使能通道) DMA1通道4发送函数:(设置dma长度和内存地址) 测试 最后 概述 本文主要是 ...

  2. android 串口一直打开_STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  3. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  4. STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷

    摘自:http://www.openedv.com/thread-63849-1-1.html 参考:https://blog.csdn.net/heda3/article/details/80602 ...

  5. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  6. STM32单片机串口空闲中断+DMA接收不定长数据

    在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打 ...

  7. MM32F3277空闲中断+DMA接收不定长数据

    摘要:在实际项目中经常用到串口接收一些不定长的数据,怎么判断这一帧数据接收完成了呢?通常使用UART非空中断配合简单的数据协议,在数据中加入帧头.帧尾,在程序中判断是否接收到帧尾来确定数据接收完毕,对 ...

  8. 【32单片机学习】(6)STM32串口+DMA收发不定长数据

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.DMA介绍 2.串口接收数据 3.实验现象 1.实验电路图 2.串口收发不定长数据视频演示 3.OLED 显示接收数据 ...

  9. STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷。

    最近经常看见坛友在论坛上问串口接收的问题,我之前刚好由于项目需要用到PLC的PPI协议,需要不停地利用串口接收数据,一开始的时候采用单字节中断的方式接收判断.但是用来做通信的时候需要不停的产生串口接收 ...

最新文章

  1. 为什么边缘概率密度是联合概率密度的积分_德甲前瞻|柏林赫塔VS柏林联合
  2. 便携式不锈钢管道焊接机器人_为什么越来越多的不锈钢管件用不锈钢焊管制作...
  3. deepin如何布署python_【玩转deepin】简单三步,教你在deepin15.11上安装Python3.7.4
  4. mysql生成随机时间
  5. 一杯水怎么测试_怎么测家里自然水的水质情况?
  6. linux十大实用工具,10大好用的Linux实用工具推荐
  7. matlab画圆(及其他常用图形)
  8. stm32霍尔编码器
  9. 热点综述 | 单细胞测序的扩展、整合与转化
  10. android 离线地图 开源,android osmdroid 加载常用离线地图格式(开源的在线地图)...
  11. typora修改主题和字体
  12. 达梦数据库常用sql
  13. Centos7安装fish shell,介绍及使用
  14. Swift - JSON
  15. 2021-11-04太空大战项目制作
  16. 南京大学计算机学院路通,路通(技术学院)老师 - 南京大学 - 院校大全
  17. ubuntu 下文件夹乱码
  18. mysql英文怎么发音_如何给孩子读英文书?
  19. 好玩有趣的初音未来的居合斩游戏HTML源码
  20. 算法模板总结(自用)

热门文章

  1. 【数据分析与可视化】天猫直通车的部分指标解析
  2. 环信SDK 头像、昵称、表情自定义和群聊设置的实现 二(附源码)
  3. 测试分析报告模板【附下载】
  4. 备战蓝桥 Day01 | 世界末日问题
  5. html5九宫格布局
  6. 利用金山安全软件轻松解决1433端口入侵的一系列现象
  7. 【蓝桥杯第八届省赛_电子钟】
  8. FLV:适合录制的多媒体格式
  9. unity透明通道加颜色_树叶透明贴图的制作原理及渲染!
  10. Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】