ESP32S3 + IDF 5.2.2 控制台终端

ESP32 中的控制台终端(Console)


目录

1 资料
2 console 组件的主要接口
  2.1 初始化repl配置
  2.2 初始化控制台设备配置
  2.3 构建repl环境
  2.4 注册命令
  2.5 启动repl环境
3 测试验证
4 小结


1 概述

    ESP-IDF 提供了 console 组件,它包含了开发基于串口的交互式控制终端所需要的所有模块,主要支持了行编辑、将命令行拆分成参数列表、参数解析、命令的注册与调度、创建 REPL (Read-Evaluate-Print-Loop) 环境等功能。

    可供参考的官方资料:
ESP-IDF 编程指南 » API 参考 » 系统 API » 控制台终端


2 console 组件的主要接口

    在ESP-IDF 的 console组件中,提供了很多功能接口,有部分接口是比较主要的,通过使用这部分的接口,就可以成功的实现基本的控制台终端功能,另一部分则是相对更高级的功能的相关接口,可以实现更为高级的功能。

2.1 初始化repl配置

    这一步可以通过预置宏 ESP_CONSOLE_REPL_CONFIG_DEFAULT 来实现repl配置对象的默认参数预设。
esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();

2.2 初始化控制台设备配置

    控制台设备配置指的是控制台的数据交互,经由哪一个外设进行,比如是串口还是CDC。常通过预置宏ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT、ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT、ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT进行。
esp_console_dev_uart_config_t hw_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();

esp_console_dev_usb_cdc_config_t hw_config = ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT();

esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT();

2.3 构建repl环境

    构建repl环境这一步,就是通过使用前面设定的repl配置对象、控制台设备配置对象作为参数,完成repl环境的构建。这一步主要使用接口:esp_console_new_repl_uart()、esp_console_new_repl_usb_cdc()、esp_console_new_repl_usb_serial_jtag()来实现。
esp_console_repl_t *repl = NULL;

esp_console_new_repl_uart(&hw_config, &repl_config, &repl);

esp_console_new_repl_usb_cdc(&hw_config, &repl_config, &repl);

esp_console_new_repl_usb_serial_jtag(&hw_config, &repl_config, &repl);

2.4 注册命令

    要向console 组件中注册命令,用户在与控制台终端交互的过程中才能使用相关命令。这一步主要通过接口esp_console_cmd_register()来进行。

    在这一步,向console 组件中注册命令之前,首先需要根据 argtable3库的规则,根据你的目标执行函数 my_test(), 设计对应的一个与之参数列表相第对应的参数集结构体类型my_test_args_t,并实例化出一个对象my_test_args;然后如同app_register_ap_set()中一样,对my_test_args对象的成员进行设置,实例化一个esp_console_cmd_t类型的对象my_test_cmd,在调用esp_console_cmd_register()完成命令的注册。

typedef struct {
    struct arg_int *index;
    struct arg_str *str;
    struct arg_end *end;
} my_test_args_t;
static my_test_args_t my_test_args;

static int my_test(int index, char* str)
{
    ESP_LOGI(TAG, "my_test(): index->%d, str->%s", index, str);

    return 0;
}

static int cmd_do_my_test(int argc, char **argv)
{
    int nerrors = arg_parse(argc, argv, (void **) &my_test_args);

    if (nerrors != 0) {
        arg_print_errors(stderr, my_test_args.end, argv[0]);
        return 1;
    }

    int index = 0;
    char* str = NULL;

    index = (uint8_t)(my_test_args.index->ival[0]);
    str = my_test_args.str->sval[0];

    ESP_LOGI(TAG, "you input is: index->%d, str->%s", index, str);
    my_test(index, str);
  
    return 0;
}

static void app_register_my_test(void)
{
    my_test_args.index = arg_int0(NULL, NULL, "<int>", "a int value");      // 可选整数参数
    my_test_args.str = arg_str0(NULL, NULL, "<string>", "a string value");  // 可选字符串参数
    my_test_args.end = arg_end(2);                                          // 参数列表结束, 最多允许有 2 个额外的未解
  
    const esp_console_cmd_t my_test_cmd = {
        .command = "my_test",
        .help = "my test, can set a int value and a string value.",
        .hint = NULL,
        .func = &cmd_do_my_test,
        .argtable = &my_test_args
    };

    esp_console_cmd_register(&my_test_cmd);

    return;
}

2.5 启动repl环境

    在完成你所有要注册的命令的注册过程之后,就可以正式启动repl环境了,这一步比较简单,直接调用esp_console_start_repl()就行。
esp_console_start_repl(repl);

3 测试验证

    创建一个Demo测试工程没通过idf.py 执行构建、烧录后,进行交互测试,测试结果如下图:

在这里插入图片描述

4 小结

    其实整个过程中,初始化repl配置、初始化控制台设备配置、构建repl环境、启动repl环境都是比较简单的,稍微复杂一点的地方在于注册命令这一步,需要根据argtable3库的规则实例化出命令对象,才能进行命令注册。

    示例Demo下载地址:
ESP32S3 + IDF5.2.2 控制台终端使用 Demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值