解决STM32串口发送多个字节数据时,接收中断只能收到第一个字节的问题

问题描述

项目中使用串口接收4G模块EC20发来的数据,数据通过串口发到单片机。
使用网络工具发送单个字节时没问题,但是发送2个字节以上数据,只能接收到第一个字节的数据,后面的数据无法接收到,而且甚至会卡死单片机。

解决思路

一个一个排查:
1、是否中断清除标志位?
2、中断内的程序占用时间过长,导致后面的数据的时候无法接收。
3、串口中断优先级太低,导致中断嵌套。将优先级设为最高。

实操

void UART4_IRQHandler(void)
{
	if (USART_GetITStatus(UART4, USART_IT_RXNE) == SET)	//判断是否是UART4的接收事件触发的中断
	{	
		uint8_t RxData = USART_ReceiveData(UART4);	
		//USART_ClearITPendingBit(UART4, USART_IT_RXNE);		//清除中断标志位
		if(TRANSPARENT_FLAG == 1)//如果打开了透传模式
		{
			printf("透传模式打开!");
			//Uart2_SendByte(RxData);//将收到的数据立马从UART2发送出去
			printf("----net data: %c\r\n",RxData);
			UART4_REV_DATA_BUFF[pRxPacket++] = RxData;//写入一个数据到buffer
		}
		else//非透传模式。按照buffer形式存储数据
		{
			if(pRxPacket < RX_BUFF_SIZE) //如果buffer索引小于buffer大小,正常
			{
				UART4_REV_DATA_BUFF[pRxPacket++] = RxData;//写入一个数据到buffer
			}
			else//如果索引溢出,作处理
			{
					pRxPacket = 0;//如果接受的数据超过设定值,则清空接收值,防止数据溢出
			}
		}
	}
}

首先,看第一步,发现确实忘记加入清除接收中断,导致接收多个字节时会卡死单片机,解决办法是在进入中断就加入清除中断语句,就是我上面注释那一行,这个可以解决卡死的问题。
加入清除中断后,发现发多个字节不再会卡死,但是却只能收到前两个字节数据。于是看第二步,我在中断里面加入了printf,也就是uart1的发送操作,我清除了里面所有的printf后,发现能够正常接收到所有的数据啦!!!当然有的文章遇到的是第三部的解决方案,这里我的uart4读中断是抢占优先级1,子优先级0.

总结

1.漏掉清除中断标志会导致程序卡死,低级问题,以后记得要加上
2.中断程序不能执行耗时长的程序以及执行发送接收过程,会存在中断嵌套的问题,会造成只执行一次的现象。

参考文章

1.嵌入式之串口中断只能收到一个字节
2.关于STM32串口接收中断中只能接收一个字节()

作者:ℳ๓. Sweet

物联沃分享整理
物联沃-IOTWORD物联网 » 解决STM32串口发送多个字节数据时,接收中断只能收到第一个字节的问题

发表评论