对这个程序有点疑问LcdShowStr(0, 0, buf+cmdLen[2]); //显示命令后的字符串这一个buf+cmdLen[2]为什么是命令后的字符串,怎么运算的,什么原理?CmpMemory这个比较函数在比较cmd2[]命令后它后面还跟着的字符串难道不比较吗?为什么?
LcdShowStr(0, 0, buf+cmdLen[2]); //显示命令后的字符串
这一个buf+cmdLen[2]为什么是命令后的字符串,怎么运算的,什么原理?CmpMemory这个比较函数在比较cmd2[]命令后它后面还跟着的字符串难道不比较吗?为什么?
CmpMemory这个比较函数在比较cmd2[]命令后它后面还跟着的字符串难道不比较吗?为什么?
bit CmpMemory(unsigned char *ptr1, unsigned char *ptr2, unsigned char len){ while (len--) { if (*ptr1++ != *ptr2++) //遇到不相等数据时即刻返回0 { return 0; } } return 1; //比较完全部长度数据都相等则返回1 } /* 串口动作函数,根据接收到的命令帧执行响应的动作 buf-接收到的命令帧指针,len-命令帧长度 */ void UartAction(unsigned char *buf, unsigned char len) { unsigned char i; unsigned char code cmd0[] = "buzz on"; //开蜂鸣器命令 unsigned char code cmd1[] = "buzz off"; //关蜂鸣器命令 unsigned char code cmd2[] = " showstr "; //字符串显示命令 unsigned char code cmdLen[] = { //命令长度汇总表 sizeof(cmd0)-1, sizeof(cmd1)-1, sizeof(cmd2)-1, }; unsigned char code *cmdPtr[] = { //命令指针汇总表 &cmd0[0], &cmd1[0], &cmd2[0], }; for (i=0; i<sizeof(cmdLen); i++) //遍历命令列表,查找相同命令 { if (len >= cmdLen[i]) //首先接收到的数据长度要不小于命令长度 { if (CmpMemory(buf, cmdPtr[i], cmdLen[i])) //比较相同时退出循环 { break; } } } switch (i) //循环退出时i的值即是当前命令的索引值 { case 0: flagBuzzOn = 1; //开启蜂鸣器 break; case 1: flagBuzzOn = 0; //关闭蜂鸣器 break; case 2: buf[len] = '\0'; //为接收到的字符串添加结束符 LcdShowStr(0, 0, buf+cmdLen[2]); //显示命令后的字符串 UartWrite(buf+cmdLen[2],len - cmdLen[2]); //返回命令后的字符串 i = len - cmdLen[2]; //计算有效字符个数 if (i < 16) //有效字符少于16时,清除液晶上的后续字符位 { LcdAreaClear(i, 0, 16-i); } break;
是否LcdShowStr这个函数里要求有一个特定数值(Cmdlen[2])的结尾呢?
看起来像是Cmdlen计算前面buffer的长度,传递给LcdShowStr这个函数,显示出来。
显示命令后的字符串应该是要现实的字符串的起始位置是:buf+cmdLen[2] 前面的应该是不需要现实的协议命令用来解析的之类的
LcdShowStr(0, 0, buf+cmdLen[2]);
这个函数第三个参数肯定是个地址。buf也就是你要显示的字符串的首地址,我猜cmdlen[]里面存放着每个指令的长度。而指令在buf里面是按顺序存放的。取出指令 i 就可以以基地址buf + 偏移地址cmdlen[i]来找到字符串i的地址。然后进行显示,或者对比指令字符串来看是哪种指令。