uiRcMoveIndex++
发布时间:2019-05-24 03:25

  返回的空函数。这是最原始的做法,也是我当年刚毕业就开始做项目的时候经常用的方法。它完全依靠作为函数的输入和输出口。我们要用到这个函数,就要把参与运算的变量直接赋给对应的输入全局变量,调用一次函数之后,再找到对应的输出变量,这些输出变量就是我们要的结果。这种方法的缺点是阅读不直观,

  第2种:用return返回参数和带输入形参的函数,这种方法已经具备了完整的输入和输出性能,比第1种方法直观多了。但是这种方法有它的局限性,因为return只能返回一个变量,如果要用在返回多个输出结果的函数中,就无能为力了,这时候该怎么办?就必须用指针了,也就是我下面讲到的第3种方法。

  通过电脑串口调试助手,往单片机发送EB 00 55 XX YY 指令,其中EB 00 55是数据头, XX是被除数,YY是除数。单片机收到指令后就会返回6个数据,最前面两个数据是第1种运算方式的商和余数,中间两个数据是第2种运算方式的商和余数,最后两个数据是第3种运算方式的商和余数。

  #define const_receive_time 5 //如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小

  * 第1种方法,用不带参数返回的空函数,这是最原始的做法,也是我当年刚毕业

  * 就开始做项目的时候经常用的方法。它完全依靠全局变量作为函数的输入和输出口。

  * 我们要用到这个函数,就要把参与运算的变量直接赋给对应的输入全局变量,

  * 调用一次函数之后,再找到对应的输出变量,这些输出变量就是我们要的结果。

  * 商ucShang_1和余数ucYu_1就是输出全局变量。这种方法的缺点是阅读不直观,

  * 第2种方法,用return返回参数和带输入形参的函数,这种方法已经具备了完整的输入和输出性能,

  * 比第1种方法直观多了。但是这种方法有它的局限性,因为return只能返回一个变量,

  * 如果要用在返回多个输出结果的函数中,就无能为力了。比如本程序,就不能同时输出

  * 商和余数,只能分两个函数来做。如果要在一个函数中同时输出商和余数,该怎么办?

  * 第3种方法,用带指针的函数,就可以顺心所欲,不受return的局限,想输出多少个

  ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据

  uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动

  * 注意,由于商和余数是指针形参,我们代入的变量必须带地址符号& 。比如&ucShang_3和&ucYu_3。

  uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动

  uiRcregTotal=0; //清空缓冲的下标,方便下次重新从0下标开始接受新数据

  delay_short(400); //每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调整

  uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来

  uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫

  ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。

  uiSendCnt=0; //及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。

  这节讲了指针的第一大好处,它的第二大好处是什么?欲知详情,请听下回分解-----指针的第二大好处,指针作为数组在函数内部的化身。