OpenEdv-开源电子网

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

新人第一次写程序,想不出错在哪求助!

[复制链接]

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
发表于 2020-12-6 23:33:50 | 显示全部楼层 |阅读模式
5金钱
我想实现单片机逐次接收任意字符时,按顺序一一回应顺序数字。程序使用for循环(条件是小于等于5),和if语句(条件是接收到数据),可实际运行时接收到第一个字符时,所有数字(1到5)一起蹦出来了,这是为啥?
1607267119(1).png

最佳答案

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

你的1到5一起跳出来是因为你没清中断标志位,当接收到一个串口中断,接收中断标志位置位后,for循环从i=1到5,一直循环检测到标志位,就会连续输出1到5
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

136

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2020-11-19
在线时间
113 小时
发表于 2020-12-6 23:33:51 | 显示全部楼层
dianyan 发表于 2020-12-7 11:52
你这for循环和串口接受的数据次数完全对不上。等于是for循环在那跑,输出的数字取决于for循环跑到几的时候 ...

你的1到5一起跳出来是因为你没清中断标志位,当接收到一个串口中断,接收中断标志位置位后,for循环从i=1到5,一直循环检测到标志位,就会连续输出1到5
八十、八十、八十!
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-6 23:45:38 | 显示全部楼层
图片贴上来瞄一眼就发现原因了这不是一顺执行下去了直接跳出循环么?有没有跳转到循环之前的方法呢?
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-6 23:51:26 | 显示全部楼层
我查资料USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET这个是查询状态标志位,同时会清楚标志位,难道不是的?
回复

使用道具 举报

3

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2020-10-12
在线时间
120 小时
发表于 2020-12-7 11:05:18 | 显示全部楼层
i=5;while(i){ if(x!=x){ switch(i){}  i--;}}  这样节约空间
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-12-7 11:17:26 | 显示全部楼层
你应该是想判断串口接收的数据,做对应的操作吗?
如果是,只需要在串口中断中判断接收寄存器的值即可,用不到for(虽然不建议在中断中做处理).
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2020-12-7 11:47:50 | 显示全部楼层
i=1  然后执行了一个i++ 刚好符合 i=2  结果出来就是 1  2 3 45   
回复

使用道具 举报

16

主题

136

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2020-11-19
在线时间
113 小时
发表于 2020-12-7 11:52:32 | 显示全部楼层
你这for循环和串口接受的数据次数完全对不上。等于是for循环在那跑,输出的数字取决于for循环跑到几的时候接收到串口数据。和第几次接收串口数据无任何关联。你应该在串口中断函数里面实现,收到一个接收中断输出一次i,然后i++。注意每次清除中断标志位。
八十、八十、八十!
回复

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2017-11-14
在线时间
34 小时
发表于 2020-12-7 17:27:42 | 显示全部楼层
读 USART_DR 才会清除 USART_SR  RXNE 位,仔细看参考手册
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-13 23:34:28 | 显示全部楼层
39527 发表于 2020-12-7 11:05
i=5;while(i){ if(x!=x){ switch(i){}  i--;}}  这样节约空间

还没学到这里,在尝试for和if语句。
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-13 23:36:26 | 显示全部楼层
a5820736 发表于 2020-12-7 11:17
你应该是想判断串口接收的数据,做对应的操作吗?
如果是,只需要在串口中断中判断接收寄存器的值即可,用 ...

没想判断,这只是在尝试for和if的使用,想每次接收任意字符时按顺序依次回复1,2,3,4,5.
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-13 23:43:39 | 显示全部楼层
simms01 发表于 2020-12-7 11:47
i=1  然后执行了一个i++ 刚好符合 i=2  结果出来就是 1  2 3 45

是的,刚发完帖子就发现了,后来了解了下goto函数,跳出去重新循环。后来又碰到新问题,我发送字符后,单片机会回复两次,后来思考好长时间,觉得是因为发送的是两个字符等于两个数组,读取第一个数组清除后,第二个数组会跟着接收就回复了第二次,一开始我以为读取后会全部清除,所以百思不得其解。我想应该是这个原因,不过我已经暂时放弃继续尝试。
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
 楼主| 发表于 2020-12-13 23:45:58 | 显示全部楼层
cjsyrzy 发表于 2020-12-7 17:27
读 USART_DR 才会清除 USART_SR  RXNE 位,仔细看参考手册

是的,要读取DR才行,不过读取DR应该只会清除第一组数组,第二组数组似乎接着接收后不会被清除,搞的我任意发送两个字符,单片机会回复两次。不知道是不是这个愿意噢。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 20:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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