OpenEdv-开源电子网

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

传感器通过发送一组数据过来,为什么我只收到了头一个数据?

[复制链接]

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
发表于 2015-4-13 21:04:17 | 显示全部楼层 |阅读模式
5金钱
在这里受到不少帮助,今天又遇到问题了,特来请教下!先谢过了!

我通过串口二连接某传感器,传感器会发生一系列数据回来。我把收到的数据通过串口一显示的同时,对其进行了处理,可为什么收到第一个数据( Res=165(0xA5) )后,第二个数据就不能收到了呢?如图所示:

我是通过传感器发给Res,之后通过for语句来判断Res是否为我想要的,但是他一直在判断收到的第一个Res,无法更新Res,我找不到原因,因为我清空了标志位的!





/*************************************以下是部分中断程序***********************************************/

u8 i=0,j=0,k=0,m=0,med=0;
void USART2_IRQHandler(void)             
{

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
         printf("*****NEW data****");
        Res2 =USART_ReceiveData(USART2);//(USART2->DR);
       printf("Res2=%d",Res2);

        /*******数据处理*********/

loop:   for(i;i<2;i++)
         { printf("Res2=%d",Res2);
             begin=Res2;
              printf("begin[");
               printf("%d",i);
               printf("]=");
               printf("%d\n",begin);
                break;
                } 
           if((begin[0]-0xA5)==0)
              {

             if((begin[1]-0x5A) ==0)
            {
                 printf("检测到起始头数据");
            }

else {i=1; goto loop;}
    }
else { i=0; goto loop; }


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

使用道具 举报

83

主题

400

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2308
金钱
2308
注册时间
2013-8-26
在线时间
230 小时
发表于 2015-4-13 22:12:52 | 显示全部楼层
中断函数写的非常不好!
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
 楼主| 发表于 2015-4-13 22:31:28 | 显示全部楼层
回复【2楼】ws_zdyz:
---------------------------------
您好!请您帮我诊断诊断!我是通过传感器发给Res,之后通过for语句来判断Res是否为我想要的,但是他一直在判断收到的第一个Res,无法更新Res,我找不到原因,因为我清空了标志位的!非常感谢!麻烦了!
回复

使用道具 举报

83

主题

400

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2308
金钱
2308
注册时间
2013-8-26
在线时间
230 小时
发表于 2015-4-13 22:36:30 | 显示全部楼层
是不是把清空标志位的语句不要放FOR里啊,瞎说的,试试吧。
还有你那LOOP是干啥的啊?怎么放中断里了啊???
回复

使用道具 举报

83

主题

400

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2308
金钱
2308
注册时间
2013-8-26
在线时间
230 小时
发表于 2015-4-13 22:40:47 | 显示全部楼层
不就是中断接收一组数据嘛,原子的例程里有好多啊,都是很好用的啊。。。
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
 楼主| 发表于 2015-4-13 22:54:31 | 显示全部楼层
回复【4楼】ws_zdyz:
---------------------------------
非常感谢你的回答!loop是为了检测数据是否满足要求,不满足就跳会loop继续检索!
回复

使用道具 举报

15

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-11-18
在线时间
4 小时
发表于 2015-4-14 09:11:07 | 显示全部楼层
“i”到最后也没看到清零,或者说“i”的值不确定了
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
 楼主| 发表于 2015-4-14 09:23:27 | 显示全部楼层
回复【7楼】feidao0608:
---------------------------------
非常感谢你的解答!我把i的变化放在else里面的(已经在原帖中贴上了),麻烦您在帮我诊断下,问题就在与Res不更新!谢谢!
回复

使用道具 举报

15

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-11-18
在线时间
4 小时
发表于 2015-4-16 09:02:04 | 显示全部楼层
接收两个字节的数速度是非常快的,你这样弄恐怕不行,你应该进入中断后
 begin=USART_ReceiveData(USART2);
 i++;
 i+到某个值之后,i 清零,或者用定时器判断一定时间后 i 清零,表示一次数据接收完毕 (要么规定一次接收数据时间,要么规定一次数据接收个数,要么像原子哥一样规定特殊的数据结尾)
接收数据完毕之后设定一个标志位为1
然后在主函数里判断标志位是否为1,
if(标志位==1)
{
 清空标志位;
for(i=0;i<2;i++)
 {
printf("%d",begin);
}
}
别在接收中断里搞发送
另外程序尽量不要用goto
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
 楼主| 发表于 2015-4-16 09:43:57 | 显示全部楼层
回复【9楼】feidao0608:
---------------------------------
真的非常感谢您的回答!对我很有帮助!如果标志位为1以后,进入主函数,但是这时候传感器还会发数据过来,这一部分数据有怎么处理呢?
回复

使用道具 举报

15

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-11-18
在线时间
4 小时
发表于 2015-4-16 17:06:10 | 显示全部楼层
回复【10楼】coolzhangone:
---------------------------------
进入(if标志位==1)后 关闭串口中断  处理完数据之后再开启串口中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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