OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11652|回复: 5

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

[复制链接]

33

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2016-5-20
在线时间
45 小时
发表于 2016-10-11 01:38:33 | 显示全部楼层 |阅读模式
5金钱
//用 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);

  }
}




最佳答案

查看完整内容[请看2#楼]

判断语句本身没有问题,肯定是使用问题。 查下USART_IT_IDLE和USART_IT_RXNE是不是会同时出现, 如果是,你的语句就会架空IDLE判断。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11535
金钱
11535
注册时间
2014-4-1
在线时间
1313 小时
发表于 2016-10-11 01:38:34 | 显示全部楼层

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

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


回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13093
金钱
13093
注册时间
2012-11-26
在线时间
3810 小时
发表于 2016-10-11 09:06:47 | 显示全部楼层
空闲中断一般是配合DMA用的,楼主可以试下DMA接收,空闲中断产生后,读取buff数据
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-26
在线时间
11 小时
发表于 2017-5-12 14:06:43 | 显示全部楼层
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-7-13
在线时间
3 小时
发表于 2017-8-2 22:05:41 | 显示全部楼层
请问一下
语句if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)中的
USART_GetITStatus(USART2, USART_IT_IDLE)也能等于1或者0吗,还是说实现了就是1
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-7-23
在线时间
22 小时
发表于 2019-12-25 11:25:05 | 显示全部楼层
苏德宾 发表于 2017-8-2 22:05
**** 作者被禁止或删除 内容自动屏蔽 ****

肯定是实现了才会是1啊,简而言之就是当计数器溢出时USART_IT_IDLE就会置位(变成1)进入中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 03:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表