# doge_cmd **Repository Path**: earth_mark/doge_cmd ## Basic Information - **Project Name**: doge_cmd - **Description**: 一个非常简单的支持类似shell命令带参数的命令解析器 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-08-06 - **Last Updated**: 2022-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # doge_cmd 一个非常简单的支持类似shell命令参数的命令解析器 主要用途: ``` 平时在嵌入式软件开发中,经常需要用到串口进行命令设置参数或者调试,这时就需要用到命令解析。 当然也可以移植一个现成的开源的shell工具,但是由于只需要解析命令的简单需求,移植一个shell太过于大材小用。 ``` ## 用法 ### 1、定义命令处理函数和命令表 ```c static void cmd1_callback(int argc, char **argv) { ... } static void cmd2_callback(int argc, char **argv) { ... } doge_cmd_t cmd_list[] = { {.cmd = "cmd1", .cb = cmd1_callback}, {.cmd = "FREQ", .cb = cmd2_callback}, }; ``` ### 2、调用doge_cmd_parse解析命令; ```c char cmd_str[100] = "cmd1 0 1" doge_cmd_parse(cmd_str, cmd_list, DOGE_CMD_COUNTOF(cmd_list)); ``` ## 测试 ```c #include #include #include "string.h" #include "math.h" #include "doge_cmd.h" static void led_cmd_callback(int argc, char **argv) { int i = 0; if (argc != 2) { printf("Usage: LED <1/0>\r\n"); return; } int state = atoi(argv[1]); if (state == 0) { printf("LED OFF\r\n"); } else { printf("LED ON\r\n"); } } static void freq_cmd_callback(int argc, char **argv) { int i = 0; printf("cmd %s, argc %d\r\n", argv[0], argc); for (i = 1; i < argc; i++) printf("argv[%d] %s\t", i, argv[i]); printf("\r\n"); int num1 = atoi(argv[1]); int num2 = atoi(argv[2]); printf("num1 = %d num2 = %d\r\n", num1, num2); } doge_cmd_t d_cmd_list[] = { {.cmd = "LED", .cb = led_cmd_callback}, {.cmd = "FREQ", .cb = freq_cmd_callback}, }; int main(void) { char str[] = " LED 1"; char str2[] = " FREQ 5 3"; char str3[] = " LED 0"; doge_cmd_parse(str, d_cmd_list, DOGE_CMD_COUNTOF(d_cmd_list)); doge_cmd_parse(str3, d_cmd_list, DOGE_CMD_COUNTOF(d_cmd_list)); printf("\r\n"); doge_cmd_parse(str2, d_cmd_list, DOGE_CMD_COUNTOF(d_cmd_list)); return 0; } ```