OpenEdv-开源电子网

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

如何解决中断标志位清除后,串口仍重复读取数据!

[复制链接]

2

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-12-1
在线时间
2 小时
发表于 2021-7-30 11:05:14 | 显示全部楼层 |阅读模式
5金钱
新手小白想实现串口2接收字符串并转化为十进制数的功能,为了方便监视过程,把每个读取到的数据实时显示出来,于是发现串口2接收一个字符之后一直显示该字符(不是printf循环的原因,而是确实重复接收该字符),本来想着是不是串口2接收一个数据之后没有将USART_FLAG_RXNE和USART_IT_RXNE清零,导致反复进入中断读取接收寄存器里的数据。但是后来发现并不是这个原因,主函数也检查过没有问题,想请教一下如何解决该问题。主函数部分和串口2中断服务函数部分如下:

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-12-1
在线时间
2 小时
 楼主| 发表于 2021-7-30 11:06:20 | 显示全部楼层
        if(USART_ReceiveData(USART2)=='a')
                                {
                                        flag=1; //a为帧开头
                                        j=0;
                                }
                                       
                                if(flag==1&&USART_ReceiveData(USART2)>='0'&&USART_ReceiveData(USART2)<='9')
                                {
                                        result[j]=USART_ReceiveData(USART2)-'0'; //字符化作对应int
                                        printf("%d",result[j]); //输出此刻接收到的数据;%d为有符号十进制整数,%u为无符号十进制整数
                                        if(USART_GetFlagStatus(USART2, USART_IT_RXNE) != RESET)
                                                printf("Flag=set"); //用来检测标志位是否被及时清除
                                        j++;
          delay_ms(100);                                       
                                }
                               
                                if(USART_ReceiveData(USART2)=='b') //b为帧结束位
                                {
                                        flag=2;
                                }
                               
                                if(flag==2) //解析成各位数字和
                                {
                                        Result=0;
                                   for(t=0;t<j;t++)
                                  {
                                          Result=Result+result[t]*pow(10.0,(j-t-1)); //pow(a,b),a的b次方,ab为float位或者double类型
                                                printf("re:%d",result[t]);
                                  }
                                        TIM2_PWM_Init(10*Result);
          //printf("%u\r\n",Result);
                                  flag=0;
          delay_ms(10);               
                          }
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-12-1
在线时间
2 小时
 楼主| 发表于 2021-7-30 11:07:46 | 显示全部楼层
void USART2_IRQHandler(void)  
{   
     if(USART_GetFlagStatus(USART2, USART_IT_RXNE) != RESET)  //接收寄存器非空
        {      
                                                USART_ClearFlag(USART2, USART_FLAG_RXNE); //FLAG是接收寄存器非空标志位
            USART_ClearITPendingBit(USART2, USART_IT_RXNE);                //IT是接收中断标志位                       
        }
        USART_ClearITPendingBit(USART2,USART_IT_ORE);                //溢出错误标志位               
}
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-12-1
在线时间
2 小时
 楼主| 发表于 2021-7-30 11:36:05 | 显示全部楼层
自顶自顶
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-12-1
在线时间
2 小时
 楼主| 发表于 2021-7-30 12:59:53 | 显示全部楼层
自顶自顶
回复

使用道具 举报

4

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2019-11-12
在线时间
77 小时
发表于 2021-7-30 15:01:02 | 显示全部楼层
光清标志不读数据是啥意思。 读取数据硬件自己会清标志的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 16:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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