stm32串口空闲中断接收不定长数据
串口空闲中断接收不定长数据
空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break中断)。
串口初始化部分采用stm32cubemx软件生成。
一、串口空闲中断加DMA方式接收
在串口初始化时开启空闲中断和DMA接收
#define BUFFER_SIZE 512 //不定长数据的最大长度,设置为100则最大长度为100
volatile int rx_len=0; //接收数据长度
volatile uint8_t recv_end_flag= 0; //接收完成标记位
uint8_t rx_buffer[BUFFER_SIZE]={0}; //接收缓存
uint8_t rx_count=0;
void MX_USART1_UART_Init(void)
{/*省略自动生成部分代码*//* USER CODE BEGIN USART1_MspInit 1 */__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);HAL_UART_Receive_DMA(&huart1, (uint8_t*)rx_buffer, BUFFER_SIZE); /* USER CODE END USART1_MspInit 1 */
}
必须添加,不然收不到第一帧数据,不能加在HAL_UART_MspInit()函数里面,会导致第一帧数据为0,且为最大长度的数据。
void UART_IRQ(UART_HandleTypeDef *huart)/*空闲中断加DMA方式*/
{uint8_t ret = 0;if(huart->Instance == USART1){ if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET){recv_end_flag = 1;__HAL_UART_CLEAR_IDLEFLAG(&huart1);HAL_UART_DMAStop(&huart1);rx_len =BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);HAL_UART_Receive_DMA(&huart1, (uint8_t*)rx_buffer, BUFFER_SIZE); }}
}
串口中断函数
extern void UART_IRQ(UART_HandleTypeDef *huart);
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 */UART_IRQ(&huart1);/* USER CODE END USART1_IRQn 1 */
}
二、串口空闲中断加接收中断方式`
初始化时开启空闲和接收中断
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{/*省略自动生成部分代码*//* USER CODE BEGIN USART1_MspInit 1 */__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);/* USER CODE END USART1_MspInit 1 */
}
void UART_IRQ(UART_HandleTypeDef *huart)/*接收和空闲中断方式*/
{if(__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET){if(recv_end_flag == UART_RX_STATE_READY){//__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);/*初始化没开启就进中断再开启*/recv_end_flag = UART_RX_STATE_START;;rx_len = 0;rx_buffer[rx_len] = huart->Instance->DR;rx_len++;}else if(recv_end_flag == UART_RX_STATE_START){rx_buffer[rx_len] = huart->Instance->DR;rx_len++;}__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);}if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET){__HAL_UART_CLEAR_IDLEFLAG(&huart1);__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);__HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);recv_end_flag = UART_RX_STATE_DEAL;}
}
三、数据处理
**/*DMA加空闲中断方式*/**
while(1){if(recv_end_flag == 1){Debugprintf("接收到数据个数:%d\r\n",rx_len);HAL_UART_Transmit(&huart3, rx_buffer, rx_len, 1000);/*通过串口转发出去*/rx_len = 0;recv_end_flag = 0;/*清标志位*/memset(rx_buffer, 0, BUFFER_SIZE);/*清buff*/}}
**/*串口空闲中断加接收中断方式*/**
while(1){if(end_flag ==UART_RX_STATE_DEAL){end_flag = UART_RX_STATE_READY;HAL_UART_Transmit(&huart1, (uint8_t*)rec_buff, rx_len, 0XFFFF);while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY);rx_len = 0;memset(rec_buff, 0, sizeof(rec_buff));__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); }/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
stm32串口空闲中断接收不定长数据相关推荐
- STM32单片机串口空闲中断接收不定长数据
在使用单片机的串口通信功能时,常用的接收数据方法是通过固定的字节数来判断一帧数是否发送完成,或者是通过固定的结束标志位来表示一帧数据发送完成.但是有时候会遇到发送的数据长度不固定,也没有固定的结束标志 ...
- STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)
STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式) 前言 串口空闲中断介绍 清中断方法 串口中断处理函数 串口中断用到的全局变量定义 串口初始化(使能接收中 ...
- STM32H7 DMA USART空闲中断接收不定长数据
1.关键设置 2.代码 2.1 bsp_usart.h /*********************************************************************** ...
- stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发
stm32的DMA收发原理,和stm32F4 + USART2 +DMA +IDLE使用,见另一篇:https://blog.csdn.net/Mark_md/article/details/1072 ...
- stm32的串口DMA空闲中断接收不等长数据,stm32F4的usart2-DMA-IDLE收发
1. 串口为什么要使用DMA?好处? 提高系统实时性:stm32单片机的串口没有FIFO,使用字节中断的方式去接收,会频繁进入中断,影响系统实时性.好在stm32的串口可以级联DMA使用,在大数据量连 ...
- STM32单片机串口空闲中断+DMA接收不定长数据
在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打 ...
- STM32 利用空闲中断接收数据
STM32 利用串口空闲中断接收不定长数据 利用cubeMX打开DMA串口接收中断 利用CubeMX打开串口中断 HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HA ...
- STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷
摘自:http://www.openedv.com/thread-63849-1-1.html 参考:https://blog.csdn.net/heda3/article/details/80602 ...
- HAL库的串口基础学习(包含串口接收不定长数据的实现)
HAL库的串口基础学习(1) HAL库有一个特点就是对于许多外设的初始化以及功能操作,都提供有一个weak版本的函数,这是充分的展现出库名字的含义(Hardware Abstraction Layer ...
最新文章
- 关于SSH远程连接报错
- JS改变input的value值不触发onchange事件解决方案 (转)
- 【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
- BUU[SCTF2019]Strange apk
- 精读《你不知道的javascript》中卷
- 关于svn、git生成版本号脚本的改进
- 怎么安装中文linux6,centos6.5下怎么安装中文输入法
- AI人才有多贵?年薪三五十万美元起步,高校教授大量投身工业界
- .NET Core SDK在Windows系统安装后出现Failed to load the hostfxr.dll等问题的解决方法
- OpenSSL新手自学:如何生成RSA私钥并用于数字签名
- csrss.exe病毒查杀
- scratch做了个病毒大战的游戏,欢迎朋友们试玩,多提意见
- python编写程序计算梯形面积公式_肿么用c语言编写程序梯形面积
- 四川大学计算机徐教授,我院举行“BIM实验室开放+徐教授专题讲座”活动
- 使用python把普通图片生成ico图标
- vulntarget-a靶场的学习思考
- java出现报错java.lang.IndexOutOfBoundsException
- flutter 接入微信客服
- 屌丝女士的移动生活养成记
- 火星坐标系转百度php,PHP版本实现火星,高德地图和百度地图坐标转换
热门文章
- git blob_如何使用Git管理二进制Blob
- Hacktoberfest活动导致GitHub捐款近5万
- github初学者指南_GitHub初学者指南
- 理论 | 教你彻底学会Java序列化和反序列化
- html aside元素
- linux系统安装xhprof,LNMP部署laravel与xhprof安装使用
- ci mysql 缓存_CodeIgniter框架中启用和清除缓存的教程
- python如何将多张excel表内数据求和_Excel批量操作,把你的工作效率提升10倍以上(1)...
- 封装axios统一请求
- docker学习1--dockerfile