• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

看一下这个单片机的编程应该如何解?

zhczlzhang 2017-11-23 浏览量:1010
对这个程序有点疑问
LcdShowStr(0, 0, buf+cmdLen[2]);  //显示命令后的字符串
这一个buf+cmdLen[2]为什么是命令后的字符串,怎么运算的,什么原理?
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;
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • buf+cmdLen[2]应该是指显示字符串的偏移吧,buf是完整的命令,而cmdLen[2],是命令的长度,buf向后移动cmdLen[2]个数据后的数据进行显示。
    CmpMemory比较的长度不是函数传来的参数len么,只比较这么长的。即cmdLen[i]长的数据,后而的不比较吧。因为你的while (len--)
    • 发布于 2017-11-23
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :制造商 AVX Corporation 制造商产品编号 TPSD476K016R0080 供应商 AVX Corporation 描述 CAP TANT 47UF 10% 16V 2917 回复

其他答案 数量:4
  • 是否LcdShowStr这个函数里要求有一个特定数值(Cmdlen[2])的结尾呢?

    看起来像是Cmdlen计算前面buffer的长度,传递给LcdShowStr这个函数,显示出来。

    • 发布于2017-11-23
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :R7S721000VCFP#AA1 详细说明: ARM®Cortex®-A9微处理器IC RZ / A1H 1核,32位400MHz 256-LQFP(28x28) 回复

  • 这个应该是根据所用的协议有关吧,要看看相关协议。
    • 发布于2017-11-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 显示命令后的字符串应该是要现实的字符串的起始位置是:buf+cmdLen[2] 前面的应该是不需要现实的协议命令用来解析的之类的​

    • 发布于2017-11-24
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :封装的区别:VIPER27HN的封装是8-DIP(0.300"",7.62mm) VIPER27LDTR封装是16-SOIC(0.154"",3.90mm 宽) 回复

  • LcdShowStr(0, 0, buf+cmdLen[2]);

    这个函数第三个参数肯定是个地址。buf也就是你要显示的字符串的首地址,我猜cmdlen[]里面存放着每个指令的长度。而指令在buf里面是按顺序存放的。取出指令 i 就可以以基地址buf + 偏移地址cmdlen[i]来找到字符串i的地址。然后进行显示,或者对比指令字符串来看是哪种指令。

    • 发布于2017-11-24
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :SN74LS161ADR 回复

相关问题

问题达人换一批

看一下这个单片机的编程应该如何解?