当前位置: 首页 > 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_buf
			uart1.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开启前先清除一下标志位。
在这里插入图片描述

相关文章:

  • 危化品经营单位考试:从基础夯实到能力提升的进阶之路​
  • 《Keras 3 : AI神经网络开发人员指南》
  • Linux 文件操作-标准IO函数4-fseek设置文件偏移量、ftell获取当前偏移量、rewind使文件偏移量(为0)定位到开头
  • 英语词性--形容词
  • 智能宠物饮水机WTL580微波雷达感应模块方案;便捷管理宠物饮水
  • 三维仿射变换-简略版
  • 【合新通信】---射频光模块
  • Deepseek使用技巧大全
  • Redis主从复制(Master-Slave Replication)解析与搭建操作指南
  • L2TP实验 作业
  • 每日OJ_牛客_DP44兑换零钱_C++_Java
  • Pytorch中layernorm实现详解
  • C语言基础(函数)
  • 正则魔法:解码 return /^\d+$/.test(text) ? text : ‘0‘ 的秘密
  • 【笔记】深度学习模型训练的 GPU 内存优化之旅:重计算篇
  • 2025最新电脑IP地址修改方法:Win系统详细步骤
  • springboot使用163发送自定义html格式的邮件
  • 为什么TCP需要三次握手?一次不行吗?
  • 【Servlet 容器和 Spring 容器的关系】
  • 人工智能之数学基础:线性方程组
  • 拍摄《我们这一代》的肖全开展“江浙沪叙事”
  • 美乌矿产协议签署被曝“临门一脚”时生变,美方提附加条件
  • 金融监管总局修订发布《行政处罚办法》,7月1日起施行
  • 国家医保局副局长颜清辉调任人社部副部长
  • 当老年人加入“行为艺术基础班”
  • 呼伦贝尔市委常委、组织部长闫轶圣调任内蒙古交通集团党委副书记