OpenEdv-开源电子网

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

原子教程的串口实验的问题

[复制链接]

12

主题

35

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1083
金钱
1083
注册时间
2016-7-22
在线时间
103 小时
发表于 2016-7-22 12:45:45 | 显示全部楼层 |阅读模式
1金钱
void USART1_IRQHandler(void)                       
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
                {
                Res =USART_ReceiveData(USART1);
                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;          
                                        }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS        
        OSIntExit();                                                                                           
#endif
}
#endif       

请问为什么       if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;       中USART_REC_LEN要减1

最佳答案

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

USART_RX_STA是接收到的数据存储在数组中的位置,是从0 开始计数的。USART_REC_LEN是允许接收的数据的最大长度,是一个数值,所以在数组中存储数据的最后一位是USART_RX_BUF
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
788
金钱
788
注册时间
2015-8-21
在线时间
128 小时
发表于 2016-7-22 12:45:46 | 显示全部楼层
USART_RX_STA是接收到的数据存储在数组中的位置,是从0 开始计数的。USART_REC_LEN是允许接收的数据的最大长度,是一个数值,所以在数组中存储数据的最后一位是USART_RX_BUF[USART_REC_LEN-1]
回复

使用道具 举报

12

主题

35

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1083
金钱
1083
注册时间
2016-7-22
在线时间
103 小时
 楼主| 发表于 2016-7-22 13:53:42 | 显示全部楼层
—孤独¥的风 发表于 2016-7-22 13:11
USART_RX_STA是接收到的数据存储在数组中的位置,是从0 开始计数的。USART_REC_LEN是允许接收的数据的最大 ...

但是上一句  USART_RX_STA++;  不是会令到在数组中存储数据的最后一位是  USART_RX_BUF[USART_REC_LEN-2]  吗
回复

使用道具 举报

4

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
788
金钱
788
注册时间
2015-8-21
在线时间
128 小时
发表于 2016-7-22 14:19:00 | 显示全部楼层
电子询问 发表于 2016-7-22 13:53
但是上一句  USART_RX_STA++;  不是会令到在数组中存储数据的最后一位是  USART_RX_BUF  吗

if(USART_RX_STA>(USART_REC_LEN-1))条件是大于不是大于等于
回复

使用道具 举报

12

主题

35

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1083
金钱
1083
注册时间
2016-7-22
在线时间
103 小时
 楼主| 发表于 2016-7-22 16:13:43 | 显示全部楼层
—孤独¥的风 发表于 2016-7-22 14:19
if(USART_RX_STA>(USART_REC_LEN-1))条件是大于不是大于等于

如果定义USART_REC_LEN为200,USART_RX_STA最大值是199, USART_RX_BUF[USART_RX_STA&0X3FFF]最大不就是 USART_RX_BUF[198],吗?
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-22 16:41:24 | 显示全部楼层
电子询问 发表于 2016-7-22 16:13
如果定义USART_REC_LEN为200,USART_RX_STA最大值是199, USART_RX_BUF最大不就是 USART_RX_BUF[198],吗 ...

怎么算的
回复

使用道具 举报

12

主题

35

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1083
金钱
1083
注册时间
2016-7-22
在线时间
103 小时
 楼主| 发表于 2016-7-22 16:50:06 | 显示全部楼层

USART_RX_STA不能大于199,USART_RX_STA的最大值就是199,因为上一语句为USART_RX_STA++,那加一之前USART_RX_STA不就是198?
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-22 16:56:12 | 显示全部楼层
199不大于199,不清零,然后等待下一次接收,运行USART_RX_BUF[199]=Res ;,再++=200,大于199,清零
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-7-22 16:57:47 | 显示全部楼层
电子询问 发表于 2016-7-22 16:50
USART_RX_STA不能大于199,USART_RX_STA的最大值就是199,因为上一语句为USART_RX_STA++,那加一之前USART ...

C语言不是数学,不要用逻辑算,一句一句走流程算
回复

使用道具 举报

12

主题

35

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1083
金钱
1083
注册时间
2016-7-22
在线时间
103 小时
 楼主| 发表于 2016-7-22 16:58:48 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-22 16:56
199不大于199,不清零,然后等待下一次接收,运行USART_RX_BUF[199]=Res ;,再++=200,大于199,清零

原来如此 谢谢解答
回复

使用道具 举报

12

主题

35

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1083
金钱
1083
注册时间
2016-7-22
在线时间
103 小时
 楼主| 发表于 2016-7-22 17:01:25 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-7-22 16:57
C语言不是数学,不要用逻辑算,一句一句走流程算

长知识了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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