STM32中串口的接收中断函数为:void USART1_IRQHandler(void)
,串口接收一个字节触发中断函数。原子哥的例程中,以串口1为例
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
原子哥的例程中接收的数据必须以换行字符作为结尾才能代表一组数据接收完毕,当然结束符可以更改。那我们能不能接收一组数据时候不需要进行添加结束符呢,回答当然是可以的。往往一组数据与一组数据之间会有间隔时间,如果这个时间存在,那么添加空闲中断使能即可。具体为在串口的初始化中添加一行使能中断空闲:
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//空闲中断使能
在串口接收中断中改为:
u8 RS485_RX_BUF_1[USART_REC_LEN_1]; //接收缓冲,最大USART_REC_LEN个字节.
u8 RX_1_Cnt=0;//接受的数据长度
void USART1_IRQHandler(void) //串口1中断服务程序
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
{
RS485_RX_BUF_1[RX_1_Cnt++] =USART_ReceiveData(USART1);//读取接收到的数据USART1->DR
if(RX_1_Cnt>=USART_REC_LEN_1)RX_1_Cnt=0;//每包的数据不能够大于数组定义的长度
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志位
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//接收完成后进入空闲中断
{
USART1->SR;//先读SR,再读DR才能完成idle中断的清零,否则会一直进入中断
USART1->DR;
RX_1_Cnt=0;//需要清零
}
}
注意清除空闲中断标志位要用到 USART1->SR;USART1->DR;用USART_ClearITPendingBit(USART1,USART_IT_IDLE)是没用的,具体可以看手册。
那么接下来分析数组RS485_RX_BUF_1中的内容即为一组接收的一组数据。
版权声明:本文为CSDN博主「烂笔头Wille」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34913944/article/details/120917866
暂无评论