一、ESP32 的 UART 概览
1、简介
ESP32芯片有三个UART控制器(UART0、UART1和UART2),具有一组功能相同的寄存器,便于编程和灵活性。
每个UART控制器可独立配置波特率、数据位长、位序、停止位数、奇偶校验位等参数。
具体工程已上传至优快云我的资源里,可直接免费下载
包含#include
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_log.h"
#include "esp_system.h"
#include "spi_flash_mmap.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "driver/ledc.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "string.h"
宏定义
/*
===========================
宏定义
===========================
*/
// UART0
#define RX0_BUF_SIZE (1024)
#define TX0_BUF_SIZE (512)
#define TXD0_PIN (GPIO_NUM_43)
#define RXD0_PIN (GPIO_NUM_44)
// UART1
#define RX1_BUF_SIZE (1024)
#define TX1_BUF_SIZE (512)
#define TXD1_PIN (GPIO_NUM_5)
#define RXD1_PIN (GPIO_NUM_4)
// UART2
#define RX2_BUF_SIZE (1024)
#define TX2_BUF_SIZE (512)
#define TXD2_PIN (GPIO_NUM_12)
#define RXD2_PIN (GPIO_NUM_13)
ESP32三路串口初始化
void uart_init(void)
{
//串口配置结构体
//串口参数配置->uart0
uart_config_t uart0_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_0, &uart0_config); //设置串口
// IO映射-> T:IO1 R:IO3
uart_set_pin(UART_NUM_0, TXD0_PIN, RXD0_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
//注册串口服务即使能+设置缓存区大小
uart_driver_install(UART_NUM_0, RX0_BUF_SIZE * 2, TX0_BUF_SIZE * 2, 0, NULL, 0);
//串口参数配置->uart1
uart_config_t uart1_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, &uart1_config); //设置串口
// IO映射-> T:IO4 R:IO5
uart_set_pin(UART_NUM_1, TXD1_PIN, RXD1_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
//注册串口服务即使能+设置缓存区大小
uart_driver_install(UART_NUM_1, RX1_BUF_SIZE * 2, TX1_BUF_SIZE * 2, 0, NULL, 0);
//串口参数配置->uart2
uart_config_t uart2_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_2, &uart2_config); //设置串口
// IO映射-> T:IO12 R:IO13
uart_set_pin(UART_NUM_2, TXD2_PIN, RXD2_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
//注册串口服务即使能+设置缓存区大小
uart_driver_install(UART_NUM_2, RX2_BUF_SIZE * 2, TX2_BUF_SIZE * 2, 0, NULL, 0);
}
接收任务
// 串口0接收任务
void uart0_rx_task()
{
uint8_t *data = (uint8_t *)malloc(RX0_BUF_SIZE + 1);
while (1)
{
//获取串口0接收的数据
const int rxBytes = uart_read_bytes(UART_NUM_0, data, RX0_BUF_SIZE, 10 / portTICK_PERIOD_MS);
if (rxBytes > 0)
{
data[rxBytes] = 0;
uart_write_bytes(UART_NUM_0, "uart0 cb\r\n", strlen("uart0 cb\r\n"));
//将接收到的数据发出去
uart_write_bytes(UART_NUM_0, (char *)data, rxBytes);
}
}
free(data);
}
//串口1接收任务
void uart1_rx_task()
{
uint8_t *data = (uint8_t *)malloc(RX1_BUF_SIZE + 1);
while (1)
{
//获取串口1接收的数据
const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX1_BUF_SIZE, 10 / portTICK_PERIOD_MS);
if (rxBytes > 0)
{
data[rxBytes] = 0;
uart_write_bytes(UART_NUM_1, "uart1 cb\r\n", strlen("uart1 cb\r\n"));
//将接收到的数据发出去
uart_write_bytes(UART_NUM_1, (char *)data, rxBytes);
}
}
free(data);
}
//串口2接收任务
void uart2_rx_task()
{
uint8_t *data = (uint8_t *)malloc(RX2_BUF_SIZE + 1);
while (1)
{
const int rxBytes = uart_read_bytes(UART_NUM_2, data, RX2_BUF_SIZE, 10 / portTICK_PERIOD_MS);
if (rxBytes > 0)
{
data[rxBytes] = 0;
uart_write_bytes(UART_NUM_2, "uart2 cb\r\n", strlen("uart2 cb\r\n"));
//将接收到的数据发出去
uart_write_bytes(UART_NUM_2, (char *)data, rxBytes);
}
}
free(data);
}
主函数入口
void app_main(void)
{
//串口初始化
uart_init();
//创建串口0接收任务
xTaskCreate(uart0_rx_task, "uart0_rx_task", 1024 * 2, NULL, configMAX_PRIORITIES, NULL);
//创建串口1接收任务
xTaskCreate(uart1_rx_task, "uart1_rx_task", 1024 * 2, NULL, configMAX_PRIORITIES, NULL);
//创建串口2接收任务
xTaskCreate(uart2_rx_task, "uart2_rx_task", 1024 * 2, NULL, configMAX_PRIORITIES - 1, NULL);
while(1)
{
//串口0数据发送测试
uart_write_bytes(UART_NUM_0, "uart0 test OK \r\n", strlen("uart0 test OK \r\n"));
//串口1数据发送测试
uart_write_bytes(UART_NUM_1, "uart1 test OK \r\n", strlen("uart1 test OK \r\n"));
//串口2数据发送测试
uart_write_bytes(UART_NUM_2, "uart2 test OK \r\n", strlen("uart2 test OK \r\n"));
vTaskDelay(2000/portTICK_PERIOD_MS);
}
}