解决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