自定义单片机命令行源码

2019-04-15 18:58发布

       调试单片机程序往往要用串口,光有输出也不够爽,我自己一直留着一份命令行代码,只要单片机资源足够就放上去。直接贴源码如下: #define PARAM_MAX (10) /* 最多支持10个参数 */ #define CLI_MAX_LEN (32) /* 缓存大小,根据资源和最长命令行长度决定 */ /* 用户输入命令行 */ unsigned char g_input_buf[CLI_MAX_LEN]; unsigned char g_input_idx = 0; /********************************************************** 函数描述 : 16进制字符转数值 输入参数 : c -- 字符,不作参数检查 输出参数 : 返 回 值 : 数值, 作 者 : gavinpeng 时 间 : 2016.11.25 ************************************************************/ unsigned char char_to_val(unsigned char c) { if ( (c >= '0') && (c <= '9') ) return c - '0'; else if ( (c >= 'A') && (c <= 'Z') ) return c - 'A' + 10; else if ( (c >= 'a') && (c <= 'z') ) return c - 'a' + 10; else return 0; } /********************************************************** 函数描述 : 字符串转数值 输入参数 : str -- 字符串 输出参数 : 返 回 值 : 数值, 作 者 : gavinpeng 时 间 : 2016.11.25 ************************************************************/ int str_to_int(unsigned char *str) { int flag; int value = 0; unsigned char *p = str; if ( NULL == str ) return 0; /* 16进制 */ if ( (str[0] == '0') && ((str[1] == 'x') || (str[1] == 'X')) ) { value = 0; p = &str[2]; while ( *p ) { value = value * 16 + char_to_val(*p); p++; } return value; } /* 10进制 */ if ( str[0] == '-' ) flag = -1; else flag = 1; value = 0; p = str; while ( *p ) value = value * 10 + char_to_val(*p++); value = value * flag; return value; } /********************************************************** 函数描述 : 命令行测试 输入参数 : 输出参数 : 返 回 值 : 作 者 : gavinpeng 时 间 : 2016.11.25 ************************************************************/ void cmd_proc_test(int argc, char *argv[]) { int val; /* test val */ if ( argc == 2 ) { val = str_to_int(argv[1]); printf("val = %d ", val); return; } } /********************************************************** 函数描述 : 命令行菜单 输入参数 : 输出参数 : 返 回 值 : 作 者 : gavinpeng 时 间 : 2016.11.25 ************************************************************/ void cmd_usage(void) { printf(" cmd usage: "); printf("? -- this menu "); printf("ver -- show version "); printf("test val -- how to use int "); } /********************************************************** 函数描述 : 处理用户输入的命令 输入参数 : 输出参数 : 返 回 值 : 作 者 : gavinpeng 时 间 : 2016.11.25 ************************************************************/ void cmd_proc(void) { int argc; char *argv[PARAM_MAX]; char *p; /* 格式化字符串,把空格分开的词放入多个字符串 */ p = (char*)g_input_buf; while ( *p && (' ' == *p) ) p++; if ( *p == '