微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第58节:指针在众多数组中的中转站作用

第58节:指针在众多数组中的中转站作用

时间:11-22 来源:互联网 点击:

的指令,

* 先转移对应的数组放到一个中间变量数组,然后发送数组。

* 由于不带指针,因此多用了6个for循环来搬运数组。

* 跟第1种函数一样,比较耗程序ROM容量,也不够简洁清晰。

*/

void send_array_2(unsigned char ucArraySec) //第2种函数,不带指针

{

unsigned int i;

unsigned char array_temp[5]; //临时中间数组

switch(ucArraySec)

{

case 1: //直接返回第1个常量数组

for(i=0;i<5;i++)

{

array_temp[i]=array_0x01[i]; //先挨个把对应的数组数据转移到中间数组里

}

break;

case 2: //直接返回第2个常量数组

for(i=0;i<5;i++)

{

array_temp[i]=array_0x02[i]; //先挨个把对应的数组数据转移到中间数组里

}

break;

case 3: //直接返回第3个常量数组

for(i=0;i<5;i++)

{

array_temp[i]=array_0x03[i]; //先挨个把对应的数组数据转移到中间数组里

}

break;

case 4: //直接返回第4个常量数组

for(i=0;i<5;i++)

{

array_temp[i]=array_0x04[i]; //先挨个把对应的数组数据转移到中间数组里

}

break;

case 5: //直接返回第5个常量数组

for(i=0;i<5;i++)

{

array_temp[i]=array_0x05[i]; //先挨个把对应的数组数据转移到中间数组里

}

break;

}

for(i=0;i<5;i++)

{

eusart_send(array_temp[i]); //把临时存放在中间数组的数据全部发送出去

}

}

/* 注释三:

* 第3种函数,内部带指针,根据上位机相关的指令,

* 先把对应的数组首地址传递给一个中间指针,然后再通过

* 指针把整个数组的数据发送出去,由于带指针,切换转移数组的数据非常快,

* 只需传递一下首地址给指针就可以,非常高效,整个函数只用了1个for循环。

* 跟前面第1,2种函数相比,更加节省程序容量,处理速度更加快,更加简洁。

*/

void send_array_3(unsigned char ucArraySec) //第3种函数,带指针

{

unsigned int i;

unsigned char *p_array; //临时中间指针,作为数组的中转站,非常高效

switch(ucArraySec)

{

case 1: //直接返回第1个常量数组

p_array=array_0x01; //把数组的首地址传递给指针,一个指令就可以,不用for来挨个搬移数据,高效!

break;

case 2: //直接返回第2个常量数组

p_array=array_0x02; //把数组的首地址传递给指针,一个指令就可以,不用for来挨个搬移数据,高效!

break;

case 3: //直接返回第3个常量数组

p_array=array_0x03; //把数组的首地址传递给指针,一个指令就可以,不用for来挨个搬移数据,高效!

break;

case 4: //直接返回第4个常量数组

p_array=array_0x04; //把数组的首地址传递给指针,一个指令就可以,不用for来挨个搬移数据,高效!

break;

case 5: //直接返回第5个常量数组

p_array=array_0x05; //把数组的首地址传递给指针,一个指令就可以,不用for来挨个搬移数据,高效!

break;

}

for(i=0;i<5;i++)

{

eusart_send(p_array[i]); //通过指针把数组的数据全部发送出去

}

}

void usart_service(void) //串口服务程序,在main函数里

{

unsigned char i=0;

unsigned char ucWhichArray;

if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来

{

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

//下面的代码进入数据协议解析和数据处理的阶段

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

while(uiRcregTotal>=4&&uiRcMoveIndex<=(uiRcregTotal-4)) //注意,这里是4,不是上一节的5,因为只有eb 00 55 xx这4个数据

{

if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55) //数据头eb 00 55的判断

{

ucWhichArray=ucRcregBuf[uiRcMoveIndex+3]; //上位机需要返回的某个数组

send_array_1(ucWhichArray); //第1种函数返回数组的5个数据,不带指针

eusart_send(0xee); //为了方便上位机观察,多发送3个字节ee ee ee作为分割线

eusart_send(0xee);

eusart_send(0xee);

send_array_2(ucWhichArray); //第2种函数返回数组的5个数据,不带指针

eusart_send(0xee); //为了方便上位机观察,多发送3个字节ee ee ee作为分割线

eusart_send(0xee);

eusart_send(0xee);

send_array_3(ucWhichArray); //第3种函数返回数组的5个数据,带指针

break; //退出循环

}

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

}

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

}

}

void eusart_send(unsigned char ucSendData) //往上位机发送一个字节的函数

{

ES = 0; //关串口中断

TI = 0; //清零串口发送完成中断请求标志

SBUF =ucSendData; //发送一个字节

delay_short(400); //每个字节之间的延时,这里非常关键,也是最容易出错的地方

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top