STM32中串口的接收中断函数为:void USART1_IRQHandler(void) ,串口接收一个字节触发中断函数。原子哥的例程中,以串口1为例
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000;
}
else
{
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];
u8 RX_1_Cnt=0;
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RS485_RX_BUF_1[RX_1_Cnt++] =USART_ReceiveData(USART1);
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;
USART1->DR;
RX_1_Cnt=0;
}
}
注意清除空闲中断标志位要用到 USART1->SR;USART1->DR;用USART_ClearITPendingBit(USART1,USART_IT_IDLE)是没用的,具体可以看手册。 那么接下来分析数组RS485_RX_BUF_1中的内容即为一组接收的一组数据。
|