if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)判断一帧数据是否接收完成不好用

2019-08-14 19:39发布

//用 if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) 判断一帧数据是否接收完成不好用,请帮忙分析,谢谢!//现在遇到的问题是,接收到一帧数据并返回后,再次等待接收,在上位机没有发任何数据的情况下,LED0会亮
//请问是不是 USART_GetITStatus(USART2, USART_IT_IDLE) != RESET 不能准确的判断一帧数据是否接收完成

//如过能这样用起来的话,程序看起来将会很清晰


//接收中断函数
void USART2_IRQHandler(void)  //数据接收中断
{  
        u8 Clear=Clear;
       
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //如果接收到了1个字节
        {                 
                if(RCV_Num_Temp<64)
                {               
                 RCV_Buffer_Temp[RCV_Num_Temp++]=USART2->DR;         //读取收到的数据,清除RXNE中断
                 LED0=0;  //接收指示       
                }                
        }
       
          else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)  //如果接收到了1帧数据
          {
           LED0=1;
           Clear=USART2->SR;  //读SR寄存器
           Clear=USART2->DR;  //读DR寄存器(先读SR再读DR,就是为了清除IDLE中断
                                               
           RCV_Complete_Temp=1;  //一帧接收完成临时缓存(1为完成)                               
          }       
       
}





//数据帧接收函数,RXNE中断使能,IDLE中断使能,是在调用 RS485_Receive_Data() 前使能的
void RS485_Receive_Data(void)
{
        u8 i;         
       
if(RCV_Complete_Temp==1)  //如果接收完1帧数据,则开始另存
{          
        USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);  //关RXNE中断使能         
        USART_ITConfig(USART2,USART_IT_IDLE,DISABLE);  //关IDLE中断使能

        RCV_Num=RCV_Num_Temp;   
                 
        for(i=0;i<RCV_Num;i++)
        {                
         RCV_Buffer[i]=RCV_Buffer_Temp[i];        
   RCV_Buffer_Temp[i]=0X00;         //清除接收到的一帧完整数据帧临时缓存                         
        }
          
         RCV_Num_Temp=-1;  //数据帧字节长度临时缓存设初值
         
         SEND_Complete_Temp=0;

         RCV_Complete=1;  //置位接收完成标志
         delay_ms(1);

  }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。