ESP32-C6(ESP-IDF):UART1可接收字符但UART0无法接收
ESP32-C6-DevKitC-1 UART0仅能发送无法接收故障排查
在ESP32-C6-DevKitC-1开发板上使用ESP-IDF开发基础UART通信,基于wifi/scan示例开发。UART1通过GPIO10、11可正常收发数据,但切换到UART0(默认GPIO16、17)时仅能发送数据,无法接收。代码仅修改了UART编号与引脚设置,连接的是官方引脚定义对应的引脚,请问故障原因是什么?
可用的UART1初始化及读取代码
void UART_Initialize_WorksOn10and11() { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_DEFAULT, }; SMILE_UART_NUM = UART_NUM_1; esp_err_t r; const int uart_buffer_size = (1024 * 2); QueueHandle_t uart_queue; r = uart_driver_install(SMILE_UART_NUM, uart_buffer_size, uart_buffer_size, 10, NULL, 0); r = uart_param_config(SMILE_UART_NUM, &uart_config); r = uart_set_pin(SMILE_UART_NUM, 11,10, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); } void UART_ReadLoop() { int reported_length = 0; esp_err_t r; r = uart_get_buffered_data_len(SMILE_UART_NUM, (size_t*)&reported_length); int bytes_to_read = reported_length; int bytes_read = uart_read_bytes(SMILE_UART_NUM, m_RxBuffer, reported_length, 0); if (bytes_read > 0) { printf("Read '%s'\n", m_RxBuffer); } }
UART0初始化代码
void UART_Initialize_DoesntWorkOnUART0() { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_DEFAULT, }; SMILE_UART_NUM = UART_NUM_0; // *** CHANGED FOR UART0 esp_err_t r; const int uart_buffer_size = (1024 * 2); QueueHandle_t uart_queue; r = uart_driver_install(SMILE_UART_NUM, uart_buffer_size, uart_buffer_size, 10, NULL, 0); r = uart_param_config(SMILE_UART_NUM, &uart_config); r = uart_set_pin(SMILE_UART_NUM, UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); // *** CHANGED FOR UART0 }
故障原因及解决方案
核心原因
ESP32-C6的UART0默认被用作系统调试串口(控制台输出),ESP-IDF默认会占用UART0的Rx引脚(GPIO17)用于接收调试命令,或被系统日志/控制台功能抢占资源,导致用户代码无法正常读取该引脚的数据。此外,系统初始化阶段已对UART0的引脚和驱动做了配置,用户后续的初始化操作未完全覆盖默认设置,尤其是Rx通道的权限。
解决步骤
禁用UART0的控制台功能
打开项目配置(idf.py menuconfig),进入Component config->ESP System Settings->UART for console output,将其改为None或其他串口(如UART1),释放UART0的Rx引脚供用户代码使用。显式指定UART0引脚并重置驱动
即使使用默认引脚,也建议显式调用uart_set_pin指定GPIO16(Tx)和GPIO17(Rx),并在安装新驱动前删除默认驱动,避免配置冲突。修改后的初始化代码如下:void UART_Initialize_DoesntWorkOnUART0() { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_DEFAULT, }; SMILE_UART_NUM = UART_NUM_0; esp_err_t r; const int uart_buffer_size = (1024 * 2); QueueHandle_t uart_queue; // 先卸载系统默认的UART0驱动 uart_driver_delete(SMILE_UART_NUM); r = uart_driver_install(SMILE_UART_NUM, uart_buffer_size, uart_buffer_size, 10, NULL, 0); r = uart_param_config(SMILE_UART_NUM, &uart_config); // 显式指定UART0的Tx和Rx引脚 r = uart_set_pin(SMILE_UART_NUM, 16, 17, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); }硬件连接检查
确认GPIO17的硬件连接无虚焊、短路,外部设备的Tx引脚电平与ESP32-C6的UART电平兼容(3.3V)。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

