OpenEdv-开源电子网

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

奇怪的串口位置问题

[复制链接]

17

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-7-18
在线时间
22 小时
发表于 2017-1-13 13:57:28 | 显示全部楼层 |阅读模式
1金钱
我写了一个关于串口接收上位机数据并加上一些单词在发送回去的函数,有一个疑惑
void USART2_IRQHandler(void)
{
       
        while(1)
        {
                while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=SET);
                *(table2+i)=USART_ReceiveData(USART2);
                i++;
                if(i!=0&&*(table2+i-1)=='\n')
                {
                        *(table2+i-1)='\0';
                        break;
                }
                        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
       
        }
        strcat(table2,"thank");
        while(*table2!='\0')
        {
                        USART_ClearFlag(USART2,USART_FLAG_TC);
                        USART_SendData(USART2,(uint16_t)*table2);
                        table2++;
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=1);
        }
        i=0;
         table2=table2_my;
}



USART_ClearITPendingBit(USART2,USART_IT_RXNE);这个函数的位置,最开始我是放到中断函数进来第一行(不在while里面),这时候我上位机发送abcd,返回来的数字却是bcd....,然后我把它移动到现在的位置,数据才正常,请问这是为什么啊,请大家指点一下

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11541
金钱
11541
注册时间
2014-4-1
在线时间
1315 小时
发表于 2017-1-13 14:27:04 | 显示全部楼层

就是。。。。每次都要clear一下才对。


回复

使用道具 举报

17

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-7-18
在线时间
22 小时
 楼主| 发表于 2017-1-13 15:20:25 | 显示全部楼层
xuande 发表于 2017-1-13 14:27
就是。。。。每次都要clear一下才对。

可是我放在第一行,不也是每次进中断都clear了吗?好奇
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-12-22
在线时间
8 小时
发表于 2017-1-13 16:57:27 | 显示全部楼层
调用USART_ClearITPendingBit(USART2,USART_IT_RXNE)这个函数的时候,已经把USART_FLAG_RXNE这个标志位也清了;所以程序会卡在while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=SET);直到b来到才能往下跑;
个人理解是这样,可以去看一下库函数是不是
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-13 17:02:25 | 显示全部楼层
不需要清位吧,读寄存器会自动清位!
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-12-22
在线时间
8 小时
发表于 2017-1-13 17:03:05 | 显示全部楼层
然后在中断里面就不用用这个状态来死等了,进了中断只要判断是否是接收中断就可以了;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{       
      USART_ReceiveData(USART2);
      USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
回复

使用道具 举报

17

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-7-18
在线时间
22 小时
 楼主| 发表于 2017-1-13 17:21:39 | 显示全部楼层
补充一下,放在最前面的话假如你多次输入abcd,但只有第一个会缺少a,后面的都不会缺,换到后面的话就全部都不少a,都完整
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-1-13 20:51:20 | 显示全部楼层
串口中断里面,不要做这么多处理,你就只负责数据接收,就行了。数据发送,不要在串口中断里面来做!! 精简一下,我认为你的问题就会解决了

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 11:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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