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

unsigned char定义的buzz on数据长度是多少

zhczlzhang 2017-11-14 浏览量:1724
如代码所示,我通过串口发送buzz on,7蜂鸣器不响,试过
buzz on,6
buzz on,12
buzz on,14
buzz on,24
buzz on,28
buzz on,48
buzz on,56
都返回bad command.代码老师说没有问题,请问buzz on数据长度是多少?我应该发送buzz on,?
QQ截图20171114104923.png
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; //开启蜂鸣器
			led = 0;
            break;
        case 1:
            flagBuzzOn = 0; //关闭蜂鸣器
            break;
        case 2:
            buf[len] = '\0';  //为接收到的字符串添加结束符
            LcdShowStr(0, 0, buf+cmdLen[2]);  //显示命令后的字符串
            i = len - cmdLen[2];              //计算有效字符个数
            if (i < 16)  //有效字符少于16时,清除液晶上的后续字符位
            {
                LcdAreaClear(i, 0, 16-i);
            }
            break;
        default:   //未找到相符命令时,给上机发送“错误命令”的提示
            UartWrite("bad command.\r\n", sizeof("bad command.\r\n")-1);
            return;
    }
    buf[len++] = '\r';  //有效命令被执行后,在原命令帧之后添加
    buf[len++] = '\n';  //回车换行符后返回给上位机,表示已执行
    UartWrite(buf, len);
}
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你的*buf中应该是还包括了结束符吧?

    buzz on 使用sizeof 的结果是8,但是你减了1,也就是7了

    CmpMemory函数你是怎么实现的呢?看看里面是不是也会检查结束符?
    • 发布于 2017-11-14
    • 举报
    • 评论 6
    • 0
    • 0
zhczlzhang 回复了 汉云:不会检查。buzz on ,8不行。 回复
汉云 回复了 zhczlzhang:把你发出的命令再回传回来看看是什么;在CmpMemory函数中把不同的那个字符通过串口发回来看看是哪个。 回复
zhczlzhang 回复了 汉云:我在void UartDriver() { unsigned char len; unsigned char pdata buf[40]; if (flagFrame) //有命令到达时,读取处理该命令 { flagFrame = 0; UartWrite(buf, sizeof(buf)); len = UartRead(buf, sizeof(buf)); //将接收到的命令读取到缓冲区中 UartAction(buf, len); //传递数据帧,调用动作执行函数 } }添加了传回BUF和数据长度,结果传回来的是很长一段空格和bad command. 回复
汉云 回复了 zhczlzhang:所以啊,这就是问题的根源了吧。你的buf里的就不是你发出的数据啊。 回复
zhczlzhang 回复了 汉云:我刚拿着程序去让老师看了,老师在开发板上运行了没有问题,我在仿真上运行却不行.然后老师说让我自己想. 回复
汉云 回复了 zhczlzhang:是不是你的仿真环境设置的不对。 回复

其他答案 数量:7
  • 楼主你可以单步调试 看看~
    • 发布于2017-11-14
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :图纸两端处可能与sheet(薄片)有关https://www.verical.com/datasheet/positronic-power-connector-PCIA60W36M400A1-AA-5055523.pdf 回复

  • 是不是比较函数出问题来
    • 发布于2017-11-14
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个是51的的单片机没办法调试仿真,串口配置函数?
    • 发布于2017-11-14
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :都有,分别是120-200(L) 和200-350(H) 回复

  • 打印bad command的时候把你的buf的数据也打印出来,然后慢慢分析,可以打印输出就多加打印,慢慢调试
    • 发布于2017-11-15
    • 举报
    • 评论 0
    • 0
    • 0

电子老工程师 回复了  :交替插入的位置不同,如附件图片 回复

  • 这种长程序,最好在程序里面加几个打印的,以便快速排查问题出在何处
    • 发布于2017-11-17
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :T资料没说明 回复

相关问题

问题达人换一批

unsigned char定义的buzz on数据长度是多少