OpenEdv-开源电子网

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

请问做串口试验时 if(USART_RX_STA&0X80)是什么意思

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-4-28
在线时间
1 小时
发表于 2012-4-28 10:58:55 | 显示全部楼层 |阅读模式

请问做串口试验时 if(USART_RX_STA&0X80)是什么意思?

USART_RX_STA代表什么,把谁的值付给了USART_RX_STA?为什么在程序里找不到aa

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

使用道具 举报

12

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-9-13
在线时间
31 小时
发表于 2017-2-26 15:24:40 | 显示全部楼层
本帖最后由 xyz1015231411 于 2017-2-26 15:44 编辑

我感觉这个问题点好多人都还没有弄清楚,我前思后想还是想不通,所以发图片求助,为什么用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),这个函数才是接收数据中断完成标志。
QQ截图20170226150958.png
QQ截图20170226151049.png
回复 支持 1 反对 0

使用道具 举报

41

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2012-4-28
在线时间
0 小时
发表于 2012-4-29 11:43:34 | 显示全部楼层
回复【3楼】hqgboy:
---------------------------------
回复【楼主位】stm32103:
---------------------------------
你知道怎么回事了吗?我现在这块也不懂。
时时心存感激,事事全力以赴。
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-1 10:41:03 | 显示全部楼层
1,串口中断,STM32有串口这个外设,在收到合法的数据后,就会置位中断标志,stm32开启中断的话,就可以响应,从而执行中断程序.串口中断不同于IO的外部中断,不是上升沿也不是下降沿.
2,汉字=2个字节.收2个字节就是个汉字了.
3,都要判断.
4,你可以这么写.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-1-31 20:36:06 | 显示全部楼层

仔细看一下这个吧,我也在这疑惑了两天才看明白。建议原子哥也多注释一下,让大家更清楚。
回复 支持 1 反对 0

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-4-28 13:27:20 | 显示全部楼层
楼主应该把程序看完的,那只是一个标志位

另外要学习论坛的搜索功能啊
努力,前进。
回复 支持 反对

使用道具 举报

5

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2011-10-24
在线时间
33 小时
发表于 2012-4-28 14:13:20 | 显示全部楼层
 if((USART_RX_STA&0x8000)==0)//接收未完成

判断接收是否完成。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-4-28
在线时间
1 小时
 楼主| 发表于 2012-4-28 16:24:13 | 显示全部楼层
回复【2楼】5498折戟沉沙:
---------------------------------
哦哦 谢谢
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-4-28
在线时间
1 小时
 楼主| 发表于 2012-4-28 16:24:29 | 显示全部楼层
回复【3楼】hqgboy:
---------------------------------
非常感谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-29 12:19:24 | 显示全部楼层
回复【楼主位】stm32103:
---------------------------------
自己定义的一个东西,具体看定义旁边的注释。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2013-1-27
在线时间
0 小时
发表于 2013-1-31 12:14:09 | 显示全部楼层
回复【3楼】hqgboy:
---------------------------------
为什么非得和0x80相与呢?求解释阿
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2013-1-27
在线时间
0 小时
发表于 2013-1-31 12:26:57 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我知道文件里面定义了u8 USART_RX_STA=0,但为什么非得和0x80相与呢?求解释阿
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-31 17:49:03 | 显示全部楼层
因为我就是这么设计的啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-31 23:49:14 | 显示全部楼层
我这个不就是注释嘛...呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-1 01:32:15 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
虽然我看到这个了还是有点儿疑惑:
1.应该是我使能了中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE),之后一旦PA.9有了数据就会进入中断吧,那STM32依据什么判断数据来了呢(是上升沿下降沿还是别的)?

2.原子哥定义的u8 Res;Res =USART_ReceiveData(USART1);即Res是按ASCII码接收的,那他是怎么接收的汉字呢?

3.中断服务函数中先是判定是否接收到\r,然后是判断是否接受到\n,这是不是就是后面串口调试助手中发送新行的指令(即在发送的字符后面加"\r""\n")?

4.常见原子哥用这样的句式“!= RESET”,为什么不用“==SET”呢?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-1 10:47:14 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
谢原子哥
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-2 14:17:13 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
原子哥,又遇到一个问题:
if(USART_RX_STA&0x8000)
{    
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;

我想问一下,这句话里面的printf("\r\nxxxxxxxx\r\n\r\n");这是直接发给串口了吗?发送数据不应该是用USART_SendData吗?>
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-2 19:20:51 | 显示全部楼层
回复【16楼】longoliver:
---------------------------------
谁说必须给USART_SendData??
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-3 23:06:49 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
倒是没说必须是USART_SendData,原子哥的意思是printf也可以咯?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-3 23:50:33 | 显示全部楼层
说到底,只要写DR就可以.
无论是你的USART_SendData还是printf,最终都是通过写DR寄存器发送.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-7-27 16:16:22 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
回复【19楼】正点原子:
---------------------------------
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 

那这个是从哪里接收数据的的呢??
我不知道我的未来怎么样,我只想把我现在所能想到的东西学了
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-7-13
在线时间
0 小时
发表于 2014-7-27 16:44:48 | 显示全部楼层
我知道了,如果要调试助手那发数据就要用if(USART_RX_STA&0x8000)
04
    {                     
05
        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
06
        printf("\r\n您发送的消息为:\r\n\r\n");
07
        for(t=0;t<len;t++)
08
        {
09
            USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
10
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
11
        }
12
        printf("\r\n\r\n");//插入换行
13
        USART_RX_STA=0;
这里面的USART_SendData函数和while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET)这个,>
我不知道我的未来怎么样,我只想把我现在所能想到的东西学了
回复 支持 反对

使用道具 举报

5

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2011-10-24
在线时间
33 小时
发表于 2014-11-24 09:37:25 | 显示全部楼层
回复【8楼】仰望星空的孩纸:
---------------------------------
就是这样设计的,个人习惯。
多看看代码。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-1-26
在线时间
0 小时
发表于 2015-2-5 18:55:05 | 显示全部楼层
看了帖子,收获还不少,嘿嘿
回复 支持 反对

使用道具 举报

16

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2441
金钱
2441
注册时间
2014-11-5
在线时间
348 小时
发表于 2015-5-24 11:41:37 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥这样设计的目的在于少用一个变量??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-24 23:11:14 | 显示全部楼层
回复【24楼】hello_galaxy:
---------------------------------
可以这么说。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2016-5-9
在线时间
22 小时
发表于 2016-6-7 12:21:26 | 显示全部楼层
正点原子 发表于 2012-4-29 12:19
回复【楼主位】stm32103:
---------------------------------
自己定义的一个东西,具体看定义旁边的注释。

我看原子哥说是自己定义的东西,可是我怎么就看不出,为什么USART_RX_STA的第15.16位为换行和结束标志位,为什么啊~原子哥~~~这个是个协议么~如果是个协议 ,哪个文件有体现呢~~困扰了我好久啊 ~原子哥
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2016-5-9
在线时间
22 小时
发表于 2016-6-7 12:22:38 | 显示全部楼层
楼主您好 能帮我解决一个问题么~~  如下
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2016-5-9
在线时间
22 小时
发表于 2016-6-7 12:23:32 | 显示全部楼层
关于USART_RX_STA,我看原子哥说是自己定义的东西,可是我怎么就看不出,为什么USART_RX_STA的第15.16位为换行和结束标志位,为什么啊~~~~这个是个协议么~如果是个协议 ,哪个文件有体现呢~~困扰了我好久啊 ~
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-8-27
在线时间
11 小时
发表于 2016-8-29 16:47:02 | 显示全部楼层
可以mark一下吗?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-5-3
在线时间
5 小时
发表于 2017-5-13 17:26:38 | 显示全部楼层
xyz1015231411 发表于 2017-2-26 15:24
我感觉这个问题点好多人都还没有弄清楚,我前思后想还是想不通,所以发图片求助,为什么用if((USART_RX_STA ...

我也不太懂,想了好久没想明白
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-5-13 17:47:24 | 显示全部楼层
标志位,看看程序就知道了
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-5-19
在线时间
4 小时
发表于 2017-6-13 17:30:59 | 显示全部楼层
我还是没明白,这个USART_RX_STA的值它是怎么改变的,我们这样定义它,但是没看见它在哪里被赋值,只看到了直接拿去判断啊。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 11:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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