STM32 利用串口空闲中断接收不定长数据

  1. 利用cubeMX打开DMA串口接收中断
  2. 利用CubeMX打开串口中断
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
  1. 打开空闲中断

    //打开空闲中断使能__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
    
  2. 使能DMA 接收数据

    //启动 DMA 接收数据
    HAL_UART_Receive_DMA(&huart2, uart2_data, 128);
    
  3. 在中断函数内部调用自定义中断函数

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 */
HB_IRQHandler(&huart2);/* USER CODE END USART2_IRQn 1 */
}
  1. 空闲中断触发以后需要清除空闲中断标志(使用如下函数),
  2. 在空闲中断函数内部计算已经传输的字节数量
uint8_t uart2_data[128];
uint8_t uart2_flag = 0;
void HB_IRQHandler(UART_HandleTypeDef *huart)
{if (huart == &huart2){if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)){HAL_UART_DMAStop(huart);//__HAL_UART_CLEAR_FLAG(huart,UART_FLAG_IDLE); //使用这个函数不生效,不知道为啥__HAL_UART_CLEAR_IDLEFLAG(huart);uart2_flag = 1;//计算获取到的数据个数//huart->RxXferSize     希望传输的数据个数//huart->hdmarx->Instance->CNDTR DMA还需要传输的字节数huart->RxXferCount = huart->RxXferSize - huart->hdmarx->Instance->CNDTR;}}
}

串口口中断函数调用自定义中断函数

/*** @brief This function handles USART2 global interrupt.*/
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 *///调用自定义函数HB_IRQHandler(&huart2);/* USER CODE END USART2_IRQn 1 */
}

cubeMX设置


main 函数初始化代码


/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_I2C1_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */printf("hello hebao\r\n");Button_Create("Button1",&Button1,Read_KEY1_Level,0);Button_Attach(&Button1, EV_CLICK, Btn1_Dowm_CallBack);           //单击Button_Attach(&Button1, EV_DOUBLE_CLICK, Btn1_Double_CallBack);  //双击Button_Attach(&Button1, EV_LONG_CLICK, Btn1_Continuos_CallBack); //连按//HAL_UART_Receive_IT(&huart2, uart2_data, 32);//打开空闲中断使能__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//启动 DMA 接收数据HAL_UART_Receive_DMA(&huart2, uart2_data, 128);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){Button_Process(); //需要周期调用按键处理函数HAL_Delay(50);if (uart2_flag){for (uint8_t i = 0; i < huart2.RxXferCount; i++){printf("%02x ", uart2_data[i]);}printf("\r\n");uart2_flag = 0;//数据处理完成以后再次打开接收数据HAL_UART_Receive_DMA(&huart2, uart2_data, 128);//__HAL_UART_CLEAR_OREFLAG(&huart2);// HAL_UART_Receive_IT(&huart2, uart2_data, 32);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

测试结果

STM32 利用空闲中断接收数据相关推荐

  1. stm32串口空闲中断接收不定长数据

    串口空闲中断接收不定长数据 空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发 ...

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

    在使用单片机的串口通信功能时,常用的接收数据方法是通过固定的字节数来判断一帧数是否发送完成,或者是通过固定的结束标志位来表示一帧数据发送完成.但是有时候会遇到发送的数据长度不固定,也没有固定的结束标志 ...

  3. STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)

    STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式) 前言 串口空闲中断介绍 清中断方法 串口中断处理函数 串口中断用到的全局变量定义 串口初始化(使能接收中 ...

  4. GD32F303RET6 串口空闲中断+DMA数据发送接收+环形缓冲区方式保存数据

    GD32F303RET6 DMA 通道映射关系 串口 源文件 #include "uart.h" #include "stdio.h" #include &qu ...

  5. stm32: 串口空闲中断的实现(HAL库)

    STM32利用串口空闲中断来分包(HAL库) 文章目录 STM32利用串口空闲中断来分包(HAL库) 1. 开发环境 2. 串口中断接收的问题和解决办法 3. 串口空闲中断分包的原理 4. STM32 ...

  6. STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。

    STM32如何从串口接收数据,取出数据中的密码段再保存到flash中 STM32如何从串口接收数据,取出数据中的密码段再保存到flash中u8 Usart2_buf[256]; unsigned in ...

  7. STM32H743+CubeMX-串口非空闲中断接收

    文章目录 一.前言 二.CubeMX 2.1.选择串口 三.代码 3.1.main.c 3.2.stm32f7xx_it.c 相关笔记: STM32H743-串口重定向printf 一.前言 在实际工 ...

  8. STM32G070RBT6基于STM32CubeMX创建串口中断接收数据

    STM32G070RBT6基于STM32CubeMX创建串口中断接收数据

  9. linux下利用RTMP协议接收数据

    在windows下利用RTMP接收数据的代码有很多的例子可以参考,但是在linux下利用rtmp协议接收数据,例子特别少.在无计可用的情况下,只能自己写代码了. 在写代码之前需要做一点事情,去rtmp ...

最新文章

  1. R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facet、facet_grid)
  2. 如何解决盗版Windows问题
  3. python使用for循环打印99乘法表-Python用for循环实现九九乘法表
  4. 使用Mysql数据库完成增删改查综合案例(JSP页面)
  5. 绝了!这款工具让 SpringBoot 不再需要Controller、Service、DAO、Mapper!
  6. Python+Opencv测量物体之间的距离
  7. 祖父元素_帮助祖父母建立Skype帐户的UX经验教训
  8. NettyMina (转)
  9. android选择图片,通过uri获取路径
  10. js中字符串按照汉字拼音排序
  11. 【聚沙成塔】-MYSQL全文索引使用MATCH AGAINST
  12. 网站制作入门指导教程
  13. cad断点快捷键_史上最好的CAD常用快捷键及使用方法集
  14. 基本算法-回溯法(迷宫问题)
  15. 数据库(Mysql)的四种隔离级别
  16. 郭敬明最经典的45句话
  17. [zz]busycai的找工之路
  18. 如何保护您的网站免受恶意软件的侵害
  19. vmware + centos + MTPuTTY 配置问题解决
  20. C语言 a--||b----c 表达式的理解 A||BC

热门文章

  1. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机||CSDN博文精选...
  2. 中移M5311-NBIOT-低功耗OPENCPU开发-MQTT
  3. mysql记录是乱码_mysql查询数据库导致中文乱码
  4. c++ dll返回容器_Windows x86 Shellcode开发:寻找Kernel32.dll地址
  5. java查漏补缺(基础篇)
  6. 计算机知识点汇总职高,计算机辅导(知识点汇总) - 慈溪职高 网站首页.doc
  7. 检测空指针 静态检测_动态扭矩和静态扭矩的区分及其应用
  8. C# 编程规范 (coding standard)
  9. [教程]Tensorflow + win10 + CPU + Python3.6+ 安装教程
  10. 通过Word 2016 发布的内容