esp32s3 uart1和uart2串口通信例程
时间: 2025-05-22 12:45:23 浏览: 23
### ESP32-S3 UART1 和 UART2 串口通信示例
ESP32-S3 提供多个串口(UART),其中 UART0 是默认调试接口,而 UART1 和 UART2 可以用于其他数据传输任务。以下是关于如何配置和使用 UART1 和 UART2 的示例代码。
#### 配置说明
在 ESP32-S3 中,UART1 默认不连接到 GPIO 引脚,因此需要通过软件重新映射其 TX/RX 到指定的 GPIO 引脚[^1]。对于 UART2,默认情况下可以使用固定的 GPIO 引脚进行通信。
以下是一个完整的 C 示例程序,展示如何初始化并使用 UART1 和 UART2 进行串口通信:
```c
#include "driver/uart.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define BUF_SIZE (1024)
// 定义 UART1 使用的 GPIO 引脚
#define UART1_TX_PIN 17 // 自定义分配给 UART1 的 TX 引脚
#define UART1_RX_PIN 18 // 自定义分配给 UART1 的 RX 引脚
void init_uart(int uart_num, int tx_pin, int rx_pin) {
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,
.rx_flow_ctrl_thresh = 120,
};
// 设置 UART 参数
uart_param_config(uart_num, &uart_config);
if (tx_pin != -1 && rx_pin != -1) { // 如果指定了自定义引脚,则设置它们
uart_set_pin(uart_num, tx_pin, rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
// 安装队列缓冲区
uart_driver_install(uart_num, BUF_SIZE * 2, BUF_SIZE * 2, 20, NULL, 0);
}
void send_data(int uart_num, char* data) {
uint8_t* buffer = (uint8_t*)data;
size_t length = strlen(data);
uart_write_bytes(uart_num, (const char*)buffer, length); // 发送数据
}
char* receive_data(int uart_num) {
static char buf[BUF_SIZE];
memset(buf, 0, sizeof(buf));
int len = uart_read_bytes(uart_num, (uint8_t*)buf, BUF_SIZE - 1, pdMS_TO_TICKS(100)); // 超时读取
return buf;
}
void uart_task(void* arg) {
while (true) {
// 向 UART1 发送消息
send_data(UART_NUM_1, "Hello from UART1!\n");
vTaskDelay(pdMS_TO_TICKS(1000));
// 接收来自 UART2 的消息
char* received = receive_data(UART_NUM_2);
printf("Received on UART2: %s", received);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void app_main() {
// 初始化 UART1 并绑定到特定 GPIO
init_uart(UART_NUM_1, UART1_TX_PIN, UART1_RX_PIN);
// 初始化 UART2 (假设使用默认引脚)
init_uart(UART_NUM_2, -1, -1); // 不改变默认引脚
// 创建任务处理 UART 数据
xTaskCreate(&uart_task, "uart_task", 2048, NULL, 5, NULL);
}
```
#### 关键点解释
- **`init_uart()` 函数**:此函数负责配置 UART 参数以及将指定的 GPIO 映射到对应的 UART 设备。
- **`send_data()` 函数**:发送字符串至指定的 UART 端口。
- **`receive_data()` 函数**:从指定的 UART 端口接收数据,并返回接收到的内容。
- **`uart_set_pin()` 方法**:允许动态更改 UART 的 TX 和 RX 所使用的 GPIO 引脚[^1]。
#### 注意事项
- 在实际应用中,请确保所选的 GPIO 引脚未被其他外设占用或冲突。
- 对于 UART1,由于它没有固定的功能引脚,必须显式调用 `uart_set_pin()` 来设定其 TX 和 RX 引脚。
- 若需更高的波特率或其他特殊功能,可调整 `uart_config_t` 结构体中的参数。
---
阅读全文
相关推荐



















