2. ESP32 移植命令行工具 xcmd(类ssh)

1.简介

xcmd是一款单片机命令行工具,移植十分方便,并且对flash与ram占用很小,旨在为单片机提供一个能够快速搭建且占用资源很小的命令行工具,可以大大加快单片机程序调试工作,它有一下几个优点。

  1. 移植十分简单
  2. 资源占用很小
  3. 支持历史记录
  4. 支持命令自动补全
  5. 支持注册快捷键
  6. 支持 xcmd_cmd_register()/xcmd_key_register方法注册命令或按键
  7. 支持 XCMD_EXPORT_CMD()/XCMD_EXPORT_KEY()方法直接导出命令或按键,不需要额外运行注册函数

2. 效果展示

在这里插入图片描述

3.开源路径

xcmd 已经有在esp32上移植的例子

https://gitee.com/two_salted_eggs/xcmd.git

4. 编译xcmd自带的esp32例程

cd xcmd/example/esp_idf
idf.py build

编译好后下载到我们的esp32板子中,连接串口我们可以到xcmd的信息
在这里插入图片描述
此时我们按下tab键或者输入help,会打印如下信息
在这里插入图片描述
图中都是xcmd自带的一些命令;

4. 移植

xcmd 已经有在esp32上移植的例子了,我们就来分析一下xcmd在esp32上如何移植;移植的代码主要时main.c中:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "xcmd.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "test.h"

int cmd_get_char(unsigned char *ch)				#给xcmd提供esp32的输出接口
{
    *ch = getc(stdin);
    return 1;
}

int cmd_put_char(unsigned char ch)				#给xcmd提供esp32的输出接口
{
    putchar(ch);
    return 1;
}

void app_main(void)
{
    xcmd_init(cmd_get_char, cmd_put_char);		#将输入、输出接口注册给xcmd
    test_cmd_init();							#这个接口中提供了一些测试命令
    test_keys_init();							#这个接口中提供了部分键盘操作接口
    
    while(1)
    {
        xcmd_task();							#xcmd执行接口
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

5. 注册我们自己命令

移植xcmd的目的就是增加我们命令,方便我们调试设备;接下来就看看如何添加命令:


#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "xcmd.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "test.h"

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

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

static int test1(int argc, char* argv[])	//增加测试命令test1 的处理函数
{
    xcmd_print(TX_GREEN    "test1 txt_color = GREEN  \r\n"   TX_DEF);	//打印绿色字体
    return 0;
}

static int test2(int argc, char* argv[])	//增加测试命令test2 的处理函数
{
    xcmd_print(TX_RED      "test2 txt_color = RED    \r\n"   TX_DEF);	//打印红色字体
    return 0;
}

static xcmd_t tcmds[] = 				//将命令 和 处理函数关联起来
{
    {"test1", test1, "print hello 1", NULL},
    {"test2", test2, "print hello 1", NULL},
};


void app_main(void)
{
    xcmd_init(cmd_get_char, cmd_put_char);
    test_cmd_init();
    test_keys_init();
    xcmd_cmd_register(tcmds, sizeof(tcmds)/sizeof(xcmd_t));  //将命令注册到 xcmd 中
    while(1)
    {
        xcmd_task();
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

编译下载到板子后的串口效果:

在这里插入图片描述
展示命令执行效果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值