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

相关推荐
数据皮皮侠AI1 小时前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
计算机毕业论文辅导3 天前
物联网实战:基于MQTT协议的智能家居数据传输系统设计与实现
1024程序员节
开开心心就好3 天前
支持批量处理的视频分割工具推荐
安全·智能手机·rust·pdf·电脑·1024程序员节·lavarel
liuyao_xianhui5 天前
Linux开发工具结尾 _make
linux·运维·服务器·数据结构·哈希算法·宽度优先·1024程序员节
学传打活7 天前
【边打字.边学昆仑正义文化】_21_爱的结晶(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
数据皮皮侠AI14 天前
顶刊同款!中国地级市风灾风险与损失数据集(2000-2022)|灾害 / 环境 / 经济研究必备
大数据·人工智能·笔记·能源·1024程序员节
Fab1an15 天前
Busqueda——Hack The Box 靶机
linux·服务器·学习·1024程序员节
技术专家16 天前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
学传打活18 天前
古代汉语是源,现代汉语是流,源与流一脉相承。
微信公众平台·1024程序员节·汉字·中华文化
学传打活23 天前
【边打字.边学昆仑正义文化】_19_星际生命的生存状况(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化