当前位置: 首页 > news >正文

STM32HAL库,解决串口UART中断接收到的第一个字节数据丢失

1.问题描述:

只有上电后第一次接收到的第一字节数据会丢失,往后再接收也不会存在问题了。

2.先贴出来重写UART中断回调函数

我在接收到第一字节数据后开启定时器中断的,做一个超时处理,每次接收到数据会对定时器计数值清零,如果超过6ms则认为一帧数据接收完毕。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){if(uart1.rx_buf_cnt >= UART1_RXSIZE - 1)	//接收数据量超限,错误{uart1.rx_buf_cnt = 0;memset(uart1.rx_buf, 0x00, sizeof(uart1.rx_buf));		HAL_UART_Transmit(huart, (uint8_t *)"数据溢出", 10, 0xFFFF);}else									//接收正常{uart1.rx_buf[uart1.rx_buf_cnt] = RxBuffer;	//接收数据存储到rx_bufuart1.rx_buf_cnt++;if(uart1.rx_buf_cnt == 1){			HAL_TIM_Base_Start_IT(&htim3);	//在接收到第一个数据后 开启定时器6ms中断	}			__HAL_TIM_SET_COUNTER(&htim3, 0);  //每次接收数据后清空计数器数值,防止超时}HAL_UART_Receive_IT(huart, (uint8_t *)&RxBuffer, 1); }
}

上电第一次接收数据总是会少第一个字节。
在这里插入图片描述

3.解决过程

一开始以为是UART初始化后没有清除接收中断标志位,尝试过清除标志位,也根据网上说得的开中断要放在初始化后,但都没有效果,仿真过程中在中断回调函数中加入断点后就可以接收到,怀疑有什么影响到回调函数了,然后把开启定时器中断函数注释掉之后就可以了,就猜测是定时器初始化后中断标志位没有清零,开启后定时器中断后就直接进入中断函数把接收数据个数直接清零了,然后就从第二个数据重新开始接收。
在这里插入图片描述

3.解决最后

正如我的猜测,果然加入清除定时器中断标志位后数据就接收正常了。
原因:在定时器初始化的时候,为了更新预装载值,会置中断标志位,所以需要在NVIC开启前先清除一下标志位。
在这里插入图片描述


http://www.mrgr.cn/news/95083.html

相关文章:

  • 基于springboot的房屋租赁系统(008)
  • L2TP实验 作业
  • 数学之握手问题
  • 基于单片机控制的电动汽车双闭环调速系统(论文+源码)
  • 微前端 qiankun vite vue3
  • Day20:丑数
  • 爬虫案例-爬取某狗音乐
  • 神经网络中层与层之间的关联
  • C++ 各种map对比
  • C语言的内存函数
  • 动平衡仿真程序设计
  • 【链表】一文搞定链表算法:从基础到实战
  • 【PCB工艺】电流、电压与电阻的关系 以及 含有电容和电感的电路
  • JavaScript 金额运算精度丢失问题及解决方案
  • Can通信流程
  • vector容器以及deque
  • 指令系统1(数据传输指令)
  • java面试题,什么是动态代理?、动态代理和静态代理有什么区别?说一下反射机制?JDK Proxy 和 CGLib 有什么区别?动态代理的底层
  • Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(五)
  • 876.链表的中间节点