配置USB CDC功能实现通过USB口的串口输入功能
一、配置 menuconfig
运行:
idf.py menuconfig
检查以下配置:
Component config → ESP System Settings → Channel for console output → USB Serial/JTAG Controller
或者直接修改 sdkconfig
文件,确保有以下配置:
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y
二、编译和测试
idf.py build
idf.py -p /dev/ttyACM0 flash monitor
三、测试相关代码
void start_serial_console(void)
{// 启动USB控制台任务xTaskCreate(usb_console_task, "usb_console", 4096, NULL, 5, NULL);
}static void usb_console_task(void *arg)
{ESP_LOGI(TAG, "Starting USB console task");// 初始化USB串口JTAG驱动usb_serial_jtag_driver_config_t usb_jtag_config = {.tx_buffer_size = 512,.rx_buffer_size = 512,};esp_err_t ret = usb_serial_jtag_driver_install(&usb_jtag_config);if (ret != ESP_OK && ret != ESP_ERR_INVALID_STATE) {ESP_LOGE(TAG, "Failed to install USB serial jtag driver: %s", esp_err_to_name(ret));vTaskDelete(NULL);return;}printf("\n========================================\n");printf("USB Serial Console Ready\n");printf("Type 'help' for available commands\n");printf("========================================\n");printf("esp32> ");char line_buffer[256];int line_index = 0;while (1) {// 从USB串口读取数据uint8_t buf[128];int len = usb_serial_jtag_read_bytes(buf, sizeof(buf) - 1, pdMS_TO_TICKS(100));if (len > 0) {for (int i = 0; i < len; i++) {char c = buf[i];// 处理回车和换行if (c == '\r') {continue; // 忽略回车}if (c == '\n') {// 执行命令if (line_index > 0) {line_buffer[line_index] = '\0';printf("\n");handle_command(line_buffer);line_index = 0;printf("esp32> ");}} else if (c == 0x08 || c == 0x7F) { // 退格键if (line_index > 0) {line_index--;printf("\b \b"); // 回退并清除字符}} else {// 普通字符if (line_index < sizeof(line_buffer) - 1) {line_buffer[line_index++] = c;printf("%c", c); // 回显字符}}}}vTaskDelay(pdMS_TO_TICKS(10));}vTaskDelete(NULL);
}