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