轻量级shell

可以移植到单片机的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,&paramTestCmd,&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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值