jianhong_wu 发表于 2014-11-16 07:14:31

鸿哥串口程序中的uiRcMoveIndex有什么作用?break是跳出while整个循环吗?已解答。

本帖最后由 jianhong_wu 于 2014-11-16 07:18 编辑

坤--温州:
鸿哥第38节内容:
while(uiRcMoveIndex>=5)   //如果处理的数据量大于等于5(2个有效数据,3个数据头)说明还没有把缓冲区的数据处理完
            {
               if(ucRcregBuf==0xeb&&ucRcregBuf==0x00&&ucRcregBuf==0x55)//数据尾eb 00 55的判断
               {
                              if(ucRcregBuf==0x01&&ucRcregBuf==0x02)//有效数据01 02的判断
                                  {
                                    uiVoiceCnt=const_voice_short; //蜂鸣器发出声音,说明数据尾和有效数据都接收正确
                                  }
                  break;   //退出循环
               }
               uiRcMoveIndex--; //因为是判断数据尾,下标向着0的方向移动
         }
                                       
         uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
问两个问题:
(1)鸿哥为什么while(uiRcMoveIndex>=5)说明还没有把缓冲区的数据处理完 呢》》总共就5个字节数据。。应该 ">=5"已经把数据处理完了。。
(2)上面代码中的break;是跳出while整个循环吗????。。。。。求解答

鸿哥-深圳:
解答这个问题的故事背景:
在一个寒冷的冬天早晨,鸿哥告别了温暖的被窝,告别了沉睡中的娇妻,毅然掀开被子,独自走出了卧室,打开了大厅里的电脑,准备解答网友“坤--温州”提出的单片机程序问题。(2014年11月16日早上6点50分左右)

                  uiRcMoveIndex=uiRcregTotal; //由于是判断数据尾,所以下标移动变量从数组的最尾端开始向0移动
            while(uiRcMoveIndex>=5)   //如果处理的数据量大于等于5(2个有效数据,3个数据头)说明还没有把缓冲区的数据处理完(1)按正常的理解,一般都是5个数据的。但是,一些项目万一由于硬件的干扰,前面多添加了几个0x00或者0xff,那么面对这种干扰情况,就不是5个字节了,可能是7个字节或者8个字节,因此鸿哥的串口程序为了抗干扰,就多增加了uiRcMoveIndex这个游标来移动去识别数据头或者数据尾,过滤掉前面的干扰0x00或者0xff等干扰数据。
你知道uiRcMoveIndex这个在第38节程序是用来干什么的吗?这个相当于数组的下标。因为是判断数据尾,所以我这次是从缓冲数组的最后一个字节往最开始的字节移动去判断,因此第一句uiRcMoveIndex=uiRcregTotal;相当于让数组下标移动到最后一个字节,当它每自减一次就判断一次,就相当于不断地往数组开始的方向移动,总有一天会自减到小于5的状态。
(2)break是跳出while(uiRcMoveIndex>=5)整个循环的。

坤--温州:
哦!理解了,鸿哥!鸿哥,打扰你了!

鸿哥-深圳:
不用客气:

页: [1]
查看完整版本: 鸿哥串口程序中的uiRcMoveIndex有什么作用?break是跳出while整个循环吗?已解答。