【STM32】HAL库——串口中断只接收到两个字符

【STM32】HAL库------串口中断只接收到两个字符

一、问题描述

环境:STM32CubeMX(6.7.0)+MDK-ARM(V5.36.0.0)+STM32F103C8T6

使用XCOM发送字符串(总共8个字符),单片机进行解析为ModBus协议失败,只接收到前两个字节的数据。

二、解决方法

原串口中断回调函数:

c 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1) //判断是哪个串口调用回调函数
    {
        if(modbus.reflag==1)     //有数据包正在处理
		{
			return;
		}
		modbus.rcbuf[modbus.recount++]=sbuf;
        printf("modbus.recount = %d, sbuf = %d\r\n", modbus.recount-1, sbuf);
		modbus.timout=0;
		if(modbus.recount ==1)  //收到主机发来的一帧数据的第一个字节
		{
			modbus.timrun=1;      //启动定时
		}
    }
    
    if(huart->Instance == USART2)
    {
        
    }
    //重新使能串口接收中断
     HAL_UART_Receive_IT(&huart1, &sbuf, sizeof(sbuf));
}

去掉串口中断回调函数的printf函数即可

c 复制代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1) //判断是哪个串口调用回调函数
    {
        if(modbus.reflag==1)     //有数据包正在处理
		{
			return;
		}
		modbus.rcbuf[modbus.recount++]=sbuf;
		modbus.timout=0;
		if(modbus.recount ==1)  //收到主机发来的一帧数据的第一个字节
		{
			modbus.timrun=1;      //启动定时
		}
    }
    
    if(huart->Instance == USART2)
    {
        
    }
    //重新使能串口接收中断
     HAL_UART_Receive_IT(&huart1, &sbuf, sizeof(sbuf));
}

三、原因分析

在嵌入式系统中,将printf函数直接放在串口中断服务程序(ISR)中会导致一些问题,这是因为printf函数通常是一个比较复杂的函数,它需要执行多个指令,而在ISR中执行复杂的操作可能导致不可预测的行为和性能问题。以下是一些原因:

1.中断上下文的限制:中断服务程序在一个称为中断上下文的环境中执行。这个上下文可能与主程序上下文有很大不同,包括栈大小和运行时限制。printfi通常依赖于一些栈和堆内存,而在中断上下文中使用这些资源可能导致栈溢出或堆破坏。

2.原子性问题:在中断中执行printf可能会打破原子性要求,这意味着中断可能在中断服务程序运行期间被其他中断中断,这可能导致数据竞争和不一致的数据状态。

3.阻塞问题:pitf函数通常需要一些时间来完成,如果在中断中执行,可能会阻塞其他中断的处理。这可能导致严重的性能问题,特别是在高优先级中断和紧急任务的情况下。

为了在嵌入式系统中进行调试和输出信息,通常推荐使用轻量级的日志或缓冲机制,以便在中断中记录信息,然后在主程序上下文中将它们输出到串口。这可以确保不会出现上述问题,同时仍然允许你进行调试和数据记录。如果你需要在中断中快速记录数据,可以使用全局变量或环形缓冲区,然后在主程序上下文中定期检查并输出这些数据。

总之,在中断中执行prit通常是不建议的,因为它可能会引发各种问题,包括性能问题和数据不一致。最好的做法是在中断中尽量保持操作的简单和快速,将复杂的操作和输出留给主程序上下文。

相关推荐
无己心11 小时前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055276 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055277 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝8 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055278 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055279 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552711 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552712 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552713 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u01030552713 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节