XCMD ,针对mcu的命令行解释器

目录

介绍

源码获取

移植

Linux平台移植

Arduino平台移植

ESP32 平台移植

配置

注册自定义命令

注册自定义快捷键


介绍

        简易的单片机命令行工具,移植十分方便,可扩展性强;支持历史记录,支持注册快捷键。目前已经在Linux、STM32、ESP32、arduino等平台上进行了移植和验证。持续更新中。

源码获取

        xcmd源码地址

移植

        需要在初始化的时候提供字符输入输出函数即可

Linux平台移植

    /* 例如移植到linux平台 */
    int cmd_get_char(uint8_t *ch)
    {
        *ch = getch();
        return 1;
    }

    int cmd_put_char(uint8_t ch)
    {
        putchar(ch);
        return 1;
    }

    int main(void)
    {
        /*调用初始化函数的时候传入字符输入输出函数*/
        xcmd_init(cmd_get_char, cmd_put_char);
        while(1)
        {
            xcmd_task();
        }
    }

Arduino平台移植

/* 例如移植到Arduino平台 */
int cmd_get_char(uint8_t *ch)
{
    if(Serial.available())
    {
        *ch =  Serial.read();
        return 1;
    }
    else
    {
        return 0;
    }
}

int cmd_put_char(uint8_t ch)
{
    Serial.write(ch);
    return 1;
}

void setup() {
    Serial.begin(115200);
    xcmd_init(cmd_get_char, cmd_put_char);
}

void loop() {
    
    xcmd_task();
}

ESP32 平台移植

int cmd_get_char(unsigned char *ch)
{
    *ch = getc(stdin);
    return 1;
}

int cmd_put_char(unsigned char ch)
{
    putchar(ch);
    return 1;
}

void app_main(void)
{
    xcmd_init(cmd_get_char, cmd_put_char);
    test_cmd_init();
    test_keys_init();
    
    while(1)
    {
        xcmd_task();
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

配置

        用户可以在src/xcmd_config.h文件中进行裁剪,以支持更小内存空间的MCU;

#define XCMD_LINE_MAX_LENGTH    (32) /* 命令行支持的最大字符数 */
#define XCMD_HISTORY_MAX_NUM    (8)  /* 支持的历史记录个数,0为不支持 */
#define XCMD_PARAM_MAX_NUM      (4)  /* 支持输入的参数个数 */

注册自定义命令

        参考模板如下:

static void cmd_echo(int argc, char* argv[])
{
    if(param_check(1, argc, argv))
	{
    	printf("%s\r\n", argv[1]);
	}
}

static void cmd_example(int argc, char* argv[])
{
    uint8_t i;
    if(param_check(1, argc, argv))
	{
		if(strcmp(argv[1], "str") == 0)
		{
			for(i=2; i<argc; i++)
		    {
		    	printf("%s\r\n", argv[i]);
			}
		}
		if(strcmp(argv[1], "int") == 0)
		{
			for(i=2; i<argc; i++)
		    {
		    	printf("%d\r\n", atoi(argv[i]));
			}
		}
		if(strcmp(argv[1], "float") == 0)
		{
			for(i=2; i<argc; i++)
		    {
		    	printf("%f\r\n", atof(argv[i]));
			}
		}
	}
}

static xcmd_t cmds[] = 
{
    {"echo", cmd_echo, "print anything", NULL},
    {"example", cmd_example, "example [-f|-i|-s] [val]", NULL},
};

void test_cmd_init(void)
{
    xcmd_register(cmds, sizeof(cmds)/sizeof(xcmd_t));
}

注册自定义快捷键

        模板如下:

int cmd_ctr_a(void* pv)
{
    printf("this is ctr+a\n");
}

int cmd_ctr_c(void* pv)
{
    exit(0);
}

static xcmd_key_t user_keys[] = 
{
    {CTR_A, cmd_ctr_a,  NULL},
    {CTR_C, cmd_ctr_c, NULL},
};

void test_keys_init(void)
{
    xcmd_key_register(user_keys, sizeof(user_keys)/sizeof(xcmd_key_t));
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32中实现XCMD命令行注册,您可以参考以下步骤: 1. 定义命令结构体 您需要定义一个命令结构体,用来描述每个命令的名称、处理函数、参数个数等信息。例如: ``` typedef struct { const char *name; // 命令名称 void (*func)(int argc, char **argv); // 命令处理函数 int argc_min; // 命令最少参数个数 int argc_max; // 命令最多参数个数 const char *desc; // 命令描述 } cmd_t; ``` 2. 实现命令处理函数 您需要实现每个命令对应的处理函数,根据命令参数进行相应的操作。例如: ``` void cmd_led(int argc, char **argv) { if (argc < 2) { printf("Usage: led on|off\r\n"); return; } if (strcmp(argv[1], "on") == 0) { // 打开LED } else if (strcmp(argv[1], "off") == 0) { // 关闭LED } else { printf("Unknown command: %s\r\n", argv[1]); } } ``` 3. 注册命令 在代码中注册命令,将命令结构体的指针添加到命令列表中。例如: ``` cmd_t cmd_list[] = { { "led", cmd_led, 1, 1, "Control LED" }, // 其他命令 }; void cmd_register(void) { int i; for (i = 0; i < sizeof(cmd_list) / sizeof(cmd_t); i++) { xcmd_register(&cmd_list[i]); } } ``` 4. 绑定串口接收函数 在串口接收函数中,根据接收到的命令字符串,解析出命令名称和参数,并根据命令名称查找对应的命令结构体,最后调用命令处理函数。例如: ``` void uart_rx_handler(uint8_t ch) { static char buf[256]; static int pos = 0; if (ch == '\r' || ch == '\n') { buf[pos] = '\0'; pos = 0; char *argv[16]; int argc = 0; char *p = strtok(buf, " "); while (p) { argv[argc++] = p; p = strtok(NULL, " "); } if (argc == 0) { return; } cmd_t *cmd = xcmd_find(argv[0]); if (cmd) { if (argc < cmd->argc_min || argc > cmd->argc_max) { printf("Invalid arguments\r\n"); return; } cmd->func(argc, argv); } else { printf("Unknown command: %s\r\n", argv[0]); } } else { buf[pos++] = ch; if (pos >= sizeof(buf)) { pos = 0; } } } ``` 以上是基本的XCMD命令行注册的实现步骤,您可以根据实际情况进行相应的修改和优化。同时,也可以在XCMD的相关文档和示例代码中获取更加详细和专业的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值