OpenEdv-开源电子网

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

for循环有没有可能被系统自动跳过

[复制链接]

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
发表于 2020-8-17 17:24:04 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 a7600241 于 2020-8-17 17:29 编辑

我搞个程序,把无线接收到的信号中一部分数据装进数组,从串口发出来,大部分情况都是正确的,但也有小部分情况发出来的数据是错误的,一个正确的数据都没有,感觉就像是装数据那里被跳过去了一样。
                  这是往里装的那部分,也没有其他前提条件,此时      cbuf【12】 ,【13】,【14】,往后依次是05 77 88 99 aa bb,可经过这部分程序从串口收到的数据不是这样,看图,这样的情况有一定概率发生,找不到原因。
                        RS485_TX_EN;
                        RS485_TX_BUF[0]=cbuf[11];
                        for(j=1;j<cbuf[12]+1;j++) //
                        {
                                RS485_TX_BUF[j]=cbuf[j+12];
                        }
                        RS485_Send_Data(RS485_TX_BUF,cbuf[12]+1);
                        for(j=0;j<20;j++) //
                        {
                                RS485_TX_BUF[j]=0;
                        }
                        RS485_RX_EN;           //接收使能

串口助手

串口助手

最佳答案

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

这个问题后来解决了,确实是cbuf被改了,因为cbuf是接收过来的函数,接收中断里标志位置位后就出来从主函数走,如果这个时候又马上接到别的东西的信号,cbuf就会改变,同时因为标志位置位,程序还会继续往下执行,所以这个时候就收到了错误的数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-17 17:24:05 | 显示全部楼层
这个问题后来解决了,确实是cbuf被改了,因为cbuf是接收过来的函数,接收中断里标志位置位后就出来从主函数走,如果这个时候又马上接到别的东西的信号,cbuf就会改变,同时因为标志位置位,程序还会继续往下执行,所以这个时候就收到了错误的数据。
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-8-17 17:42:54 | 显示全部楼层
不可能跳过。除非你cbuf[12]等于0
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4919
金钱
4919
注册时间
2015-1-10
在线时间
617 小时
发表于 2020-8-18 08:38:55 | 显示全部楼层
cbuf内容是否在其他地方有修改
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-18 10:36:50 | 显示全部楼层
阿侑kevin 发表于 2020-8-18 08:38
cbuf内容是否在其他地方有修改

没有的,cbuf就是通过无线接收过来的数据,然后拿过来直接处理了转成串口发送
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-18 10:38:05 | 显示全部楼层
thisisdemo 发表于 2020-8-17 17:42
不可能跳过。除非你cbuf[12]等于0

我这最下面一串数据不知道怎么来的,还有的时候会有更多的数据,超过数组上限,还会导致跑飞............
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-18 10:42:56 | 显示全部楼层
thisisdemo 发表于 2020-8-17 17:42
不可能跳过。除非你cbuf[12]等于0

我cbuf【12】就没有超过5的时候,也没有等于0 的时候,但是就会出现这么一大串数据,就很神奇
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1434
金钱
1434
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-8-18 10:51:36 | 显示全部楼层
a7600241 发表于 2020-8-18 10:42
我cbuf【12】就没有超过5的时候,也没有等于0 的时候,但是就会出现这么一大串数据,就很神奇

cbuf是不是在中断接收的,然后放在全局变量里面的?如果是这样,你能确保在你处理的过程中,保证cbuf不变吗?
回复

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1053
金钱
1053
注册时间
2020-5-11
在线时间
253 小时
发表于 2020-8-18 11:02:48 | 显示全部楼层
叶子君 发表于 2020-8-18 10:51
cbuf是不是在中断接收的,然后放在全局变量里面的?如果是这样,你能确保在你处理的过程中,保证cbuf不变 ...

有道理
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1434
金钱
1434
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-8-18 11:04:43 | 显示全部楼层

用环形队列试试,例子可以看我发的按键demo。里面使用到了环形队列
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2020-8-18 15:44:09 来自手机 | 显示全部楼层
cbuf没有初始化清零?
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-19 11:03:43 | 显示全部楼层
l6931639 发表于 2020-8-18 15:44
cbuf没有初始化清零?

cbuf倒是没清,现在弄好了,我往txbuf里面装东西之前清一次,用完再清一次,这样测试了20分钟,暂时没这种问题了。
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2020-8-19 11:21:57 | 显示全部楼层
仿真看数据把
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-19 14:54:37 | 显示全部楼层

仿真看过数据,cbuf那里还没毛病,但发出来就是错的了,打断点在发送的下一句,发送缓存就是上面提到的乱码那种,而cbuf是正确的数据,所以我才想是不是for循环错过了.
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-19 15:06:26 | 显示全部楼层
叶子君 发表于 2020-8-18 10:51
cbuf是不是在中断接收的,然后放在全局变量里面的?如果是这样,你能确保在你处理的过程中,保证cbuf不变 ...

是不变的啊,我在上面这段话发送的下一条打过断点,搞了好多次,碰见了一次这样的情况我特意看了cbuf,此时的cbuf是没错的,不过txbuf就有问题了,很神奇。
回复

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2019-8-27
在线时间
44 小时
 楼主| 发表于 2020-8-29 09:39:15 | 显示全部楼层
叶子君 发表于 2020-8-18 10:51
cbuf是不是在中断接收的,然后放在全局变量里面的?如果是这样,你能确保在你处理的过程中,保证cbuf不变 ...

我现在才想起来你说的啥意思....你说的对,确实是这样,应该把这个回答采纳为最佳答案的,但我刚才自己回答了采纳了自己的,不太会调,不好意思,谢谢大佬,之前是我没有理解到。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1434
金钱
1434
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-8-31 08:24:22 | 显示全部楼层
a7600241 发表于 2020-8-29 09:39
我现在才想起来你说的啥意思....你说的对,确实是这样,应该把这个回答采纳为最佳答案的,但我刚才自己回 ...

所以对于在中断接收数据的,在主函数里处理接收数据的,建议采用环形队列,让收发的数据分离。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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