单片机中字符串比较。。。

2019-07-15 10:39发布

背景:单片机通过串口和上位机PC通讯,通过串口助手发送命令(字符形式)控制单片机执行相应的动作。单片机中利用一个 unsigned char str[] 数组接收字符。比较方式:1,使接收数组一位一位和字符比较(例如:if(str[0]=='o') &&str[1]=='f'&&str[2]=='f'){  })程序结果正常
2,为了后续比较方便,将程序简单修改。首先定义好unsigned char arry[]="off"; 然后直接重写strcmp函数
unsigned char Str_Cmp(const unsigned char* str1, const unsigned char* str2)
{
        while(*str1 == *str2)
        {
                if(*str1 == '')
                        return 0;
                str1++;
                str2++;
        }
        return (*str1-*str2);
}

最后进行判断比较         
if(!Str_Cmp(str, arry))
{
        printf(" 数组相同 ");
}
else
{
        printf(" 数组不同 ");
}
结果:输入off,打印结果是“数组不同”。后续将接收的str和arry都打印出来,都显示的是“off”,这我就不太明白了,所以想请教一下老师们这是什么原因!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
hu25886
1楼-- · 2019-07-15 22:09
猎国倾城 发表于 2017-5-30 11:28
你程序有问题,问题出在这儿   return 0;和return (*str1-*str2);以及这f(!Str_Cmp(str, arry))
{
        printf(" 数组相同 ");

每个字符都会对应一个十进制数,如果两字符不同它们之差总会出现等于零、大于零、小于零的值。if(判断条件){}
只要判断条件非零(即>0||<0的条件都可)。我认为我的逻辑没问题,但是我还是会考虑一下。。。。
hu25886
2楼-- · 2019-07-15 22:15
帅气的王建峰 发表于 2017-5-30 12:47
我觉得是函数定义的形参类型有问题,const是常类型。
由于变量没有初始化,所以初始值就不确定。而常类型又不能更正变量值,所以比较错误。
题主可以将  const  删去验证下我的说法正确与否。

朋友,我试了一下,好像不是这个问题。
我将程序修改了一下:将串口重定向至printf()和scanf(),接收数组定义为char s[]类型,通过strcmp(s,"cmd")函数判断比较结果,现象是正确的。
最后,又利用串口接收终端函数接收字符串,发现接收字符数组末位没有出现'';然后我又遍历该数组,还是没有''这一位。上网查资料,好像许多人都发现串口助手发送字符串是不带''。
问题又来了:没有''的还是字符串吗?
人中狼
3楼-- · 2019-07-16 02:03
串口助手发送的是数据,串口助手又如何区分该发送的是数据还是字符串,应该只能你的程序来做处理了
人中狼
4楼-- · 2019-07-16 05:00
 精彩回答 2  元偷偷看……
帅气的王建峰
5楼-- · 2019-07-16 08:32
hu25886 发表于 2017-6-2 15:34
朋友,我试了一下,好像不是这个问题。
我将程序修改了一下:将串口重定向至printf()和scanf(),接收数组定义为char s[]类型,通过strcmp(s,"cmd")函数判断比较结果,现象是正确的。
最后,又利用串口接收终端函数接收字符串,发现接收字符数组末位没有出现'';然后我又遍历该数组,还是没有''这一位。上网查资料,好 ...

串口通信是通过SBUF寄存器一个字节一个字节传输的吧!有没有'' 要看你在程序上设定的接收数组的长度吧。

一周热门 更多>