You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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通道的权限。

解决步骤

  1. 禁用UART0的控制台功能
    打开项目配置(idf.py menuconfig),进入Component config -> ESP System Settings -> UART for console output,将其改为None或其他串口(如UART1),释放UART0的Rx引脚供用户代码使用。

  2. 显式指定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);
    }
    
  3. 硬件连接检查
    确认GPIO17的硬件连接无虚焊、短路,外部设备的Tx引脚电平与ESP32-C6的UART电平兼容(3.3V)。


内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:51:20