可以移植到单片机的shell
#include <iostream>
#include <string.h>
using namespace std;
int helpCmdFun(int argc, char*argv[]);
int paramTestCmdFun(int argc, char *argv[]) ;
int printfParamFunc(int argc,char *argv[]);
typedef int (*T_ShellFun)(int argc, char*argv[]);
typedef struct
{
char* name; /*命令的名字*/
char* help; /*帮助描述*/
T_ShellFun fun; /*命令函数*/
}T_ShellCmd;
T_ShellCmd helpCmd= /*命令描述*/
{
.name = (char*)"help",
.help = (char*)"show all cmd list",
.fun = helpCmdFun
};
T_ShellCmd paramTestCmd = /*命令描述结构体*/
{
.name= (char*)"test",
.help = (char*)"(int a=0, float b=0) show tow param val", /*参数提示,使用函数参数书写方式,有等于号表明默认参数,无参数不提示参数项*/
.fun = paramTestCmdFun
};
T_ShellCmd printfParamCmd = /*命令描述结构体*/
{
.name= (char*)"printfTest",
.help = (char*)"show param", /*参数提示,使用函数参数书写方式,有等于号表明默认参数,无参数不提示参数项*/
.fun = printfParamFunc
};
T_ShellCmd *sysCmd[100]={&helpCmd,¶mTestCmd,&printfParamCmd};
/*
* 提供int字符串转int
*/
int shellStr2Int(const char *str, uint8_t* ok)
{
int ret;
if(str == NULL)
{
*ok = false;
return 0;
}
*ok=(uint8_t)sscanf(str,"%d", &ret);
if(*ok != 1)
{
*ok = false;
return 0;
}
return ret;
}
/*
* 提供flaot字符串转浮点数功能
*/
float shellStr2Float(const char *str, uint8_t* ok)
{
float ret;
if(str == NULL)
{
*ok = false;
return 0;
}
*ok=(uint8_t)sscanf(str,"%f", &ret);
if(*ok != 1)
{
*ok = false;
return 0.0;
}
return ret;
}
/*
* 提供16进制字符串转数字的功能
*/
int shellStr2Hex(const char *str, uint8_t* ok)
{
int ret;
if(str == NULL)
{
*ok = false;
return 0;
}
*ok=(uint8_t)sscanf(str,"%X", &ret);
if(*ok != 1)
{
*ok = false;
return 0;
}
return ret;
}
/*例程 helpCmdFun*/
int helpCmdFun(int argc, char*argv[]) /*命令函数*/
{
uint8_t i;
for(i=0; sysCmd[i]; i++)
{
printf("%-15s %s\r\n",sysCmd[i]->name, sysCmd[i]->help);
}
return 0;
}
/*例程 paramTestCmdFun,此例程序可以接收两个参数,int a,float b*/
int paramTestCmdFun(int argc, char *argv[]) /*命令函数*/
{
uint8_t reti,retf;
int vali;
float valf;
printf("get param num %d\r\n", argc); /*如果用户输入的参数不够cmd函数使用,将传入一个默认的地址,其内容为 '\0' */
vali = shellStr2Int(argv[0], &reti); /*提供的字符串转int函数*/
valf = shellStr2Float(argv[1], &retf); /**/
printf("int[%d]:%d\r\n", reti,vali );
printf("float[%d]:%f\r\n",retf,valf );
return argc;
}
/*例程*/
int printfParamFunc(int argc,char *argv[])
{
int i=0;
for(i=0;i<argc;i++)
{
cout<<argv[i]<<endl;
}
}
/*从命令字符串中解析到命令和其参数
* 获取到的paramArry[0]为要允许的命令名
* 其他的为命令参数
* 返回值为获取到的参数的个数(包括一个命令名)
*/
uint8_t shellGetParam(char* line, char *paramArry[], uint8_t arryLen)
{
uint8_t i,ret;
char *ptr = NULL;
ptr = strtok(line, " ");
for(i=0; ptr!=NULL &&i<arryLen; i++)
{
paramArry[i] = ptr;
ptr = strtok(NULL, ",");
}
ret = i;
return ret;
}
#define SHELL_LINE_MAX_LEN 64
#define SHELL_PARAM_MAX_NUM 5
char shellLine[SHELL_LINE_MAX_LEN]={0};
char *shellParam[5]={0};
uint8_t shellMain(void)
{
uint8_t paramNum = 0;
if(cin.getline(shellLine, SHELL_LINE_MAX_LEN))
{
paramNum = shellGetParam(shellLine,shellParam, SHELL_PARAM_MAX_NUM);
if(paramNum)
{
uint8_t i=0;
for(i=0; sysCmd[i]; i++) /*查找命令名字*/
{
if(strcmp(sysCmd[i]->name, shellParam[0]) == 0)
{
int value = sysCmd[i]->fun(paramNum-1, &shellParam[1]); /*运行命令函数*/
printf("value %d = 0x%x\r\n", value, value); /*打印运行结果*/
return 1;
}
}
if(sysCmd[i] == NULL) /*没有找到命令*/
{
printf("C interp: unknown symbol name \'%s\' \r\n",shellLine); /*打印错误信息*/
}
}
printf("->");
}
return 0;
}