Background
在很多调试场景,需要临时向某个寄存器写入某个值,或者是例如在调试PID的时候需要频繁的修改PID参数,很多时候往往是反复的编译与烧录,十分的麻烦。所以基于ESP-IDF的console模块可以实现自定义命令来实现交互式的命令行。
Links
Quick Start
include:
#include "argtable3/argtable3.h"
#include "esp_console.h"
#include "esp_system.h"
#include "esp_log.h"
总体结构:
使用espidf的console模块实现基本的基于串口或者USB的数据收发缓冲处理与硬件配置,使用argtable实现对命令字符串的解析,也就是将命令和参数解析出来,供用户方便使用。
基本配置流程
1.建立基本的数据结构用来保存用户配置:
esp_console_repl_t *repl = NULL;
esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT();
/* Prompt to be printed before each line.
* This can be customized, made dynamic, etc.
*/
repl_config.prompt = PROMPT_STR ">";
repl_config.max_cmdline_length = CONFIG_CONSOLE_MAX_COMMAND_LINE_LENGTH;
esp_console_repl_t : 终端实例
esp_console_repl_config_t :配置信息结构体
2.添加一些ESPIDF自带的命令集:
/* Register commands */
esp_console_register_help_command();
register_system_common();
register_system_sleep();
3.根据硬件通讯方式对终端环境进行初始配置:
(1)使用UART
esp_console_dev_uart_config_t hw_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_console_new_repl_uart(&hw_config, &repl_config, &repl));
(2)使用USB CDC
esp_console_dev_usb_cdc_config_t hw_config = ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_console_new_repl_usb_cdc(&hw_config, &repl_config, &repl));
(3)使用USB JTAG(ESP32自带)
esp_console_dev_usb_serial_jtag_config_t hw_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&hw_config, &repl_config, &repl));
4.之后便可以添加自定义的命令(稍后见)
5.开启终端服务
ESP_ERROR_CHECK(esp_console_start_repl(repl));
之后,便可以实现基本的命令行交互了:
可以输入 help查看系统提供的命令
例如可以查看系统任务信息等等:
自定义命令
主要包含三个部分:
1.命令定义
2.命令参数解析
3.命令回调函数
首先定义一个函数用来注册自定义命令:
void register_my_command()
{
// 定义命令的参数
//arg_str1表示这个参数是必须的 用户必须提供
struct arg_str *arg1 = arg_str1(NULL, NULL, "<arg1>", "First argument");
//arg_str0表示这个参数是可选参数 用户可以不提供
struct arg_str *arg2 = arg_str0(NULL, NULL, "<arg2>", "Second argument");
//使用srg_end表示参数表结束 里面的2表示前面的参数的个数
struct arg_end *end = arg_end(2);
// 组合参数和结束符 按照实际输入顺序
void *argtable[] = { arg1, arg2, end };
// ESP-IDF注册命令
esp_console_cmd_t cmd = {
.command = "my_command",//命令名称(到时候输入的命令)
.help = "This is a command with arguments",//命令提示(输入一半会提示)
.hint = NULL,//命令提示颜色
.func = &my_command_handler,//回调函数
.argtable = argtable//参数表
};
ESP_ERROR_CHECK(esp_console_cmd_register(&cmd));//注册命令
}
对自定义命令定义回调函数并对命令参数进行处理:
//对自定义命令进行参数解析
static int my_command_handler(int argc, char **argv)
{
// 处理命令行参数
if (argc > 1) {
printf("Argument 1: %s\n", argv[1]);
}
if (argc > 2) {
printf("Argument 2: %s\n", argv[2]);
}
return 0;
}
最后在主函数中esp_console_start_repl之前添加自定义命令的函数register_my_command()即可。
之后,在回调函数中可将字符串形式的命令参数转换为数字或者其他格式并调用其他函数实现调试逻辑的部署。