第58节:指针在众多数组中的中转站作用
的指令,
* 先转移对应的数组放到一个中间变量数组,然后发送数组。
* 由于不带指针,因此多用了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); //每个字节之间的延时,这里非常关键,也是最容易出错的地方
指针数组中转 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)