乐鑫技术交流
直播中

张明

8年用户 1087经验值
私信 关注
[问答]

ESP32-S3-WROOM-1U-N8R8 UART1用默认引脚调试不通怎么解决?

测试ESP32-S3-WROOM-1U-N8R8模块,自己画的板子,用的串口1默认引脚,写数据一直没有数据写出来,同样程序串口0可以写出来。
请教这样问题的原因是什么?如何解决?谢谢。

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"

static const int RX_BUF_SIZE = 1024;

#define TXD_PIN (GPIO_NUM_10)
#define RXD_PIN (GPIO_NUM_11)

void init(void) {
    const 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,
    };
    // We won't use a buffer for sending data.
    uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
    uart_param_config(UART_NUM_1, &uart_config);
    //uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}

int sendData(const char* logName, const char* data)
{
    const int len = strlen(data);
    const int txBytes = uart_write_bytes(UART_NUM_1, data, len);
    ESP_LOGI(logName, "Wrote %d bytes", txBytes);
    return txBytes;
}

static void tx_task(void *arg)
{
    static const char *TX_TASK_TAG = "TX_TASK1";
    esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
    while (1) {
        sendData(TX_TASK_TAG, "Hello world");
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

static void rx_task(void *arg)
{
    static const char *RX_TASK_TAG = "RX_TASK";
    esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
    uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE+1);
    while (1) {
        const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);
        if (rxBytes > 0) {
            data[rxBytes] = 0;
            ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
            ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
        }
    }
    free(data);
}

void app_main(void)
{
    init();
    xTaskCreate(rx_task, "uart_rx_task", 1024*2, NULL, configMAX_PRIORITIES, NULL);
    xTaskCreate(tx_task, "uart_tx_task", 1024*2, NULL, configMAX_PRIORITIES-1, NULL);
}
         

回帖(1)

youyoulan

2024-6-27 16:56:39
首先,我们需要确保您的代码和硬件设置正确。以下是一些建议和解决方案:

1. 检查硬件连接:确保UART1的TXD和RXD引脚正确连接到您的开发板。ESP32-S3-WROOM-1U-N8R8的默认UART1引脚为TXD1(GPIO_NUM_10)和RXD1(GPIO_NUM_9)。

2. 检查代码中的引脚定义:在您的代码中,TXD_PIN已正确定义为GPIO_NUM_10,但RXD_PIN的定义似乎被截断了。请确保RXD_PIN定义为GPIO_NUM_9,如下所示:

```c
#define RXD_PIN (GPIO_NUM_9)
```

3. 初始化UART:确保您已正确初始化UART1。以下是一个示例初始化代码:

```c
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
};
uart_param_config(UART_NUM_1, &uart_config);
```

4. 检查串口缓冲区:确保您的串口发送和接收缓冲区足够大,以避免数据丢失。在您的代码中,RX_BUF_SIZE已设置为1024,这应该足够大。

5. 检查串口发送和接收函数:确保您使用了正确的UART发送和接收函数。以下是一个发送和接收数据的示例:

```c
// 发送数据
char *data_to_send = "Hello, World!";
size_t data_length = strlen(data_to_send);
uart_write_bytes(UART_NUM_1, data_to_send, data_length);

// 接收数据
uint8_t rx_buffer[RX_BUF_SIZE];
size_t rx_length = 0;
uart_read_bytes(UART_NUM_1, rx_buffer, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);
```

6. 检查串口波特率:确保您的发送和接收设备的波特率设置相同。在您的代码中,波特率已设置为115200。

7. 使用串口调试助手:使用串口调试助手(如PuTTY、Tera Term等)来监控UART1的接收数据,以确保数据被正确发送和接收。

8. 检查电源和地线:确保您的开发板的电源和地线连接正确,以避免电源问题影响串口通信。

9. 检查ESP32-S3-WROOM-1U-N8R8模块:如果可能,请尝试使用另一个ESP32-S3-WROOM-1U-N8R8模块,以排除硬件故障的可能性。

通过以上步骤,您应该能够找到问题的原因并解决UART1调试不通的问题。如果问题仍然存在,请检查您的硬件设计和布线,以确保没有其他问题影响串口通信。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分