基于zigbee命令解释器实现

zigbee的参数比较多例如panid、channel等参数需要配置,第一种是通过在代码的配置文件里写好,第二种就是通过串口发送命令实现参数配置,类似玉AT指令。然后从网上参考了他人的例子,以及自己实际情况修改。上篇文章是实现的是将串口数据提取出来保存到nv数据库。接下来实现命令方式。


首先定义一个结构体,其作用是包含一个命令的信息
typedef struct {
				char  const *cmd_name;//命令名称
				char max_args;//最大参数数目
				void (*handle)(void * cmd_arg);//命令回调函数
				//char *help;//帮助信息(根据需要添加)
}cmd_list_struct;

再定义一个结构体,其作用是将接收到的命令解析出来存入的地方
typedef struct{
				char processed_buf[CMD_BUF_LEN];//储存加工后的命令
				uint8 cmd_arg[ARG_NUM];//保存命令的参数
}cmd_analyze_struct;
结构体定义
cmd_list_struct cmd_list[]={
               {"panid",0,Panid_get},
		{"cpanid",1,Panid_changle},
		{"channel",0,Channel_get},
		{"cchannel",1,Channel_changel},
               {"rset",0,rset},
};
cmd_analyze_struct cmd_analyze;

 
 
char cmd_arg_analyze(char *rec_buf,int len);//将接收到数据做处理,提取出命令及参数
void Cmd_Analyze(void);//匹配命令,如果是该命令,将调用其回调函数 void Panid_get(void *cmd_arg); void Panid_changle(void *cmd_arg); void Channel_get(void *cmd_arg); void Channel_changel(void *cmd_arg); void rset(void *cmd_arg);

好,接下来是命令的分析
char cmd_arg_analyze(char *rec_buf, int len)  
{  
   char i;  
   char blank_space_flag=0;    //空格标志  
   char arg_num=0;             //参数数目  
   char index[ARG_NUM];        //有效参数首个数字的数组索引  
   char cunt=0;
   char cunt1=0;
    /*先做一遍分析,找出参数的数目,以及参数段的首个数字所在rec_buf数组中的下标*/  
    for(i=0;i<len;i++)  
    {  
       if(rec_buf[i]==0x20)        //为空格  
       {  
           blank_space_flag=1;                
           continue;  
       }  
        else if(rec_buf[i]==0x00 ||rec_buf[i]==0x21)   //结束符
       {
	   blank_space_flag=0; 
           break;  
       }  
       else  
       {  
           if(blank_space_flag==1)  
           {  
                  
                if(arg_num < ARG_NUM)  
                {  
                  cmd_analyze.cmd_arg[cunt++] = rec_buf[i];//将参数提取出出来保存到结构体中
                }  
                else  
                {  
                    return -1;      //参数个数太多  
                }  
           } 
	   if(blank_space_flag == 0) 
	  {
		cmd_analyze.processed_buf[cunt1++]=rec_buf[i+1];//将命令提取出来保存在结构体中
	  }
       }  
    }
	  return arg_num;
}

现在是实现命令的匹配

void Cmd_Analyze(void)
{	
	char i;
			for(i=0;i<sizeof(cmd_list)/sizeof(cmd_list[0]);i++)
				{
					if(!strncmp(cmd_analyze.processed_buf,cmd_list[i].cmd_name,strlen(cmd_list[i].cmd_name)))
						{
							cmd_list[i].handle((void *)cmd_analyze.cmd_arg);
					}

			}              
}

基本一个命令解释器就这样实现,摆脱if else

参考文章        https://blog.csdn.net/zhengyanan815/article/details/54582686       
                     https://blog.csdn.net/zhzht19861011/article/details/50654242

猜你喜欢

转载自blog.csdn.net/wwy__/article/details/79800669