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