OpenEdv-开源电子网

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

串口试验中 if((USART_RX_STA&0x8000)==0)接收未完成,if(USART_RX_STA&0x4000)接收到了0X0d 疑问

[复制链接]

12

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-9-13
在线时间
31 小时
发表于 2017-2-26 16:29:58 | 显示全部楼层 |阅读模式
1金钱
我感觉这个问题点好多人都还没有弄清楚,我前思后想还是想不通,所以发图片求助,为什么用if((USART_RX_STA&0x8000)==0)来判断接收数据未完成。USART_RX_STA只是前面定义的一个全局变量,并且赋值为0,这个变量和串口中断中的一些寄存器位没有任何关系,并且这个USART_RX_STA全局变量在程序中又不会变化,永远是0,USART_RX_STA&0x8000的最后得到的值也就是始终为0X0000,这个数值又怎能判断接收数据完成?这里是不是应该用这个函数USART_GetITStatus(USART1, USART_IT_RXNE),这个函数才是接收数据中断完成标志。


还有这个if(USART_RX_STA&0x4000)接收到了0X0D是什么东西?

最佳答案

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

0x0D(asc码是13) 指的是“回车” \r是把光标置于本行行首0x0A(asc码是10) 指的是“换行” \n是把光标置于下一行
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-26 16:29:59 | 显示全部楼层
0x0D(asc码是13) 指的是“回车” \r是把光标置于本行行首0x0A(asc码是10) 指的是“换行” \n是把光标置于下一行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-27 22:33:33 | 显示全部楼层
你仔细看串口中断服务函数代码,就明白了。
回复

使用道具 举报

supermake 该用户已被删除
发表于 2017-3-11 12:01:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

supermake 该用户已被删除
发表于 2017-3-11 12:07:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-5
在线时间
2 小时
发表于 2017-9-1 10:23:15 | 显示全部楼层
我感觉这个程序只能运行一次,这个全局变量在接收到一次数据后就会有值,而在第二次的时候 if((USART_RX_STA&0x8000)==0 是不成立的啊?不成立就无法进入下面的第二次接收数据,求解惑!
回复

使用道具 举报

10

主题

71

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2017-1-17
在线时间
37 小时
发表于 2017-9-1 12:45:28 | 显示全部楼层
没有接收完,他就会一直接收,并且存到xxxbuff数组里面
接收完毕之后,:   :  USART_RX_STA&0x80 = 1;  
看帖回复是一种美德
http://openedv.com/?fromuser=caijie0513
回复

使用道具 举报

10

主题

71

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2017-1-17
在线时间
37 小时
发表于 2017-9-1 12:45:45 | 显示全部楼层
就是自己定义的一个小协议
看帖回复是一种美德
http://openedv.com/?fromuser=caijie0513
回复

使用道具 举报

6

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
320
金钱
320
注册时间
2017-10-14
在线时间
80 小时
发表于 2017-10-15 01:14:33 | 显示全部楼层
对,后面有两句给变量赋值的语句
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2018-1-11
在线时间
24 小时
发表于 2018-6-5 15:46:43 | 显示全部楼层
我和你碰到同样的问题,假如if(USART_RX_STA&0x4000)接收到了0X0D我也知道是13,但如何对应0X4000>.
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-9-10
在线时间
3 小时
发表于 2018-9-30 10:26:02 | 显示全部楼层
                if((USART_RX_STA&0x8000)==0)
                {
                        if(USART_RX_STA&0x4000)
                        {
                                if(Res!=0x0a)
                                        USART_RX_STA=0;
                                else
                                        USART_RX_STA|=0x8000;       
                        }
                        else
                        {       
                                if(Res==0x0d)
                                        USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }                 
                        }
                }
代码中有体现,0x4000与0x8000道理是一样的
回复

使用道具 举报

0

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2019-1-3
在线时间
22 小时
发表于 2019-1-5 17:26:44 | 显示全部楼层
0x8000,即二进制1000 0000 0000 0000,与变量USART_RX_STA,按位与(&),并与0比较,作用是判断USART_RX_STA数值第16位是否为0,0x4000是一样的道理,刚才明白,给萌新分享一下
回复

使用道具 举报

0

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2019-1-3
在线时间
22 小时
发表于 2019-1-7 10:30:58 | 显示全部楼层
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-5-28
在线时间
8 小时
发表于 2019-7-29 23:26:32 | 显示全部楼层
mark
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2019-10-15
在线时间
44 小时
发表于 2019-10-20 23:52:19 | 显示全部楼层
francischu 发表于 2017-9-1 10:23
**** 作者被禁止或删除 内容自动屏蔽 ****

最后有个USART_RX_STA=0
回复

使用道具 举报

0

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-9-23
在线时间
111 小时
发表于 2019-10-22 14:49:12 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-12-5
在线时间
6 小时
发表于 2019-12-11 12:27:49 来自手机 | 显示全部楼层
为什么将if(usart rx sta &0x8000)改为if(usart rx sta &0x8000)==1就不行啊?
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-12-26
在线时间
9 小时
发表于 2020-1-13 23:40:14 来自手机 | 显示全部楼层
兄弟,我也遇到了这个问题,还没解决
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-7-13
在线时间
20 小时
发表于 2020-8-15 21:27:50 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-8-1
在线时间
1 小时
发表于 2020-8-26 16:20:06 | 显示全部楼层
本帖最后由 fpgabamboo 于 2020-8-26 16:29 编辑
阳SS 发表于 2019-1-5 17:26
0x8000,即二进制1000 0000 0000 0000,与变量USART_RX_STA,按位与(&),并与0比较,作用是判断USART_RX_ ...

这下知道了,“if((USART_RX_STA&0x8000)==0)”中的0x8000是和" if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始  else USART_RX_STA|=0x8000;//接收完成了  "中的0x8000是呼应的。同理0x4000也是一样的,大家认为0x0a、0x0d同0x8000、0x4000在数值上存在“某种相等关系”, 他们的关系,只是在这里自己临时定义的。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-7-20
在线时间
11 小时
发表于 2020-11-2 15:05:47 | 显示全部楼层
很赞同20的说法。USART_RX_STA这个局部变量不能单独理解。需要结合程序理解。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-11-4
在线时间
1 小时
发表于 2020-11-4 14:26:30 | 显示全部楼层
USART_RX_STA是接收数量计算,接收到2的14次方数据.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 12:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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