OpenEdv-开源电子网

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

串口实验,有两段代码看不懂,求解释

[复制链接]

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-27
在线时间
4 小时
发表于 2013-7-23 11:14:50 | 显示全部楼层 |阅读模式

在串口代码中


 

最后一句len=USART_RX_STA&0x3f;是怎么得到此次接收到的数据长度的?求原子哥解释一下,谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-23 11:38:16 | 显示全部楼层
因为原子哥在串口接收函数中,利用判断串口接收到的数据是否为(0X0D..0X0A)回车键,进行接收结束的判断,同时如果遇到结束,即同时接受到那两个字节,则将接收标志字的最高位置为1,表示接收完毕。。当要处理接收缓冲数组是否正确接受到数据时,就直接判断标志字的最高位是否被置1即可。
回复 支持 反对

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-23 11:38:33 | 显示全部楼层
因为原子哥在串口接收函数中,利用判断串口接收到的数据是否为(0X0D..0X0A)回车键,进行接收结束的判断,同时如果遇到结束,即同时接受到那两个字节,则将接收标志字的最高位置为1,表示接收完毕。。当要处理接收缓冲数组是否正确接受到数据时,就直接判断标志字的最高位是否被置1即可。
回复 支持 反对

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-23 11:41:55 | 显示全部楼层
而标志字中,刚好最高位为接收是否完成标志,而低七位刚好记录了接收的字节个数,所以直接仅对低七位与0X7F进行求与运算,得到接收字节个数的结果。
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-7-23 15:06:00 | 显示全部楼层
len=USART_RX_STA&0x3f;//这个是限制长度的,就是不能超过0x3f=63,就是长度接收超过63位自动从0位开始接收,这和缓冲器定义的大小有关的。modbus里的经常这样来限定接收长度的。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-27
在线时间
4 小时
 楼主| 发表于 2013-7-23 16:12:55 | 显示全部楼层
回复【4楼】SCMBBS_HJH:
---------------------------------
3 楼越说我越糊涂了,哪里能够看出来最高位为接收是否完成标志,低七位刚好记录了接收的字节的个数?这个源代码接收到的数据长度是以字节为单位计算的?还有源代码定义USART_RX_STA为u16,是无符号短整型,为16位,而0x8000为32位,两个相与结果能判断最高位是否为1?
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-27
在线时间
4 小时
 楼主| 发表于 2013-7-23 16:16:11 | 显示全部楼层
是我自己搞错了吗,不好意思,看错了,0x8000也是16位的,前面一个问题还是不太明白,求三楼解释,谢谢
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-27
在线时间
4 小时
 楼主| 发表于 2013-7-23 16:23:01 | 显示全部楼层
回复【4楼】SCMBBS_HJH:
---------------------------------
而且源代码不是与0x7f相与,而是0x3f
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-23 19:20:20 | 显示全部楼层
回复【6楼】lgjcumt2013:
---------------------------------
源代码是u16,说明你看的应该是战舰板的代码.
mini板是u8的,所以采用&0X3F.
而战舰板,那就是0X3FFF了.
所以战舰板库函数例程,这里有点小问题,改为0X3FFF,才是最好的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-23 20:56:10 | 显示全部楼层
回复【8楼】lgjcumt2013:
---------------------------------
你理解下结束标注为接受到回车键(0X0D+0X0A),然后接收标志字USART_RX_STA中的最高两位用来标志接收的回车键的最高两个字节(而连续接受到0X0D+0X0A则将最高位则置为1,表示接收结束),除去最高两位,剩下的位被用来记录接收数据的个数;而读取接收数组时,直接判断接收标志字的最高位是否为1,如果是的话,就对接收的数据进行操作。。。。记得不是很清楚,建议多看几遍原子哥编写那个函数。。回答错的请见解
回复 支持 反对

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-23 21:02:47 | 显示全部楼层
回复【8楼】lgjcumt2013:
---------------------------------
是与0X3F进行与()MINI板的。。战舰的应该是与0X3FFF....不好意思,我能错了,不是0X7F,记得不是很清楚。。我也是菜鸟。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-23
在线时间
3 小时
发表于 2013-7-23 21:32:48 | 显示全部楼层
通求这个问题,原子能不能抽时间把个串口中断程序讲一下啊。就是带回车结束那个
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-23 23:05:50 | 显示全部楼层
这个问题实在简单的不得了啊...

关键就是这个USART_RX_STA的寄存器,其实不是stm32自己的寄存器,而是我们定义的一个变量,当成寄存器用罢了,强制指定特定位为特定的功能,本想方便大家理解,没想到...
还是看这三行注释吧,其他什么也不说了:

//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2015-4-18
在线时间
17 小时
发表于 2015-4-18 19:43:51 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
原子哥,这个USART_RX_STA是怎么接收数据的,或者程序里只是定义u16 USART_RX_STA=0; 但具体USART_RX_STA怎么从一个变量根据接收的信息改变0~15位的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2015-4-18
在线时间
17 小时
发表于 2015-4-19 20:07:44 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
回复【13楼】正点原子:
---------------------------------
对,就是这个,我一直想不明白变量怎么就成了寄存器。
//接收状态 
//bit15, 接收完成标志 
//bit14, 接收到0x0d 
//bit13~0, 接收到的有效字节数目 
u16 USART_RX_STA=0;       //接收状态标记
这些功能是怎么实现的,这个自己定义的变量是怎么当成寄存器来用的?u16 USART_RX_STA是一个变量,【【bit15, 接收完成标志 ;bit14, 接收到0x0d 】】这是怎么实现的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-19 22:34:10 | 显示全部楼层
回复【16楼】priate:
---------------------------------
其实还是个变量,只是认为规定某个位代表什么意思,然后在某些地方设置这个位,在另外一些地方读取这个位。
就相当于一个寄存器的作用了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-9-29
在线时间
1 小时
发表于 2015-9-29 21:23:57 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
在哪个地方设置了这个位,只看到都是判断这个位
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-9-29
在线时间
1 小时
发表于 2015-9-29 21:25:27 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
看到了,下面那个else
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 07:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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