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);

  }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
xuande
1楼-- · 2019-08-14 20:14

判断语句本身没有问题,肯定是使用问题。

查下USART_IT_IDLE和USART_IT_RXNE是不是会同时出现,
如果是,你的语句就会架空IDLE判断。


jermy_z
2楼-- · 2019-08-15 00:10
空闲中断一般是配合DMA用的,楼主可以试下DMA接收,空闲中断产生后,读取buff数据
小帅哥gaoyi
3楼-- · 2019-08-15 05:40
苏德宾
4楼-- · 2019-08-15 08:35
请问一下
语句if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)中的
USART_GetITStatus(USART2, USART_IT_IDLE)也能等于1或者0吗,还是说实现了就是1

一周热门 更多>