ESP32-S2学习记录-uart串口使用

前言

本文旨在记录ESP32-S2的学习研究记录,实现ESP32-S2搭载NB-IoT BC26模块进行低功耗网络通信

目录

前言

1. uart_init

2. 使用说明


1. uart_init

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"

#define UART_TXD	        36
#define UART_RXD	        37
#define UART_RTS		    (UART_PIN_NO_CHANGE)
#define UART_CTS		    (UART_PIN_NO_CHANGE)

#define UART_BAUD_RATE		115200
#define UART_BUF_SIZE		512


static const char *TAG = "uart";
const uart_port_t uart_num = UART_NUM_1;

void uart_init() {
	if (uart_is_driver_installed(uart_num)) {
		ESP_LOGE(TAG, "UART_NUM_1 already been uesd!");
		uart_driver_delete(uart_num);
	}
	// set uart params
	uart_config_t uart_config = {
        .baud_rate = UART_BAUD_RATE,
        .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_APB,
    };
	// config uart params
	ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
	// set uart pin
	ESP_ERROR_CHECK(uart_set_pin(uart_num, UART_TXD, UART_RXD, UART_RTS, UART_CTS));
	// install driver
	ESP_ERROR_CHECK(uart_driver_install(uart_num, UART_BUF_SIZE * 2, UART_BUF_SIZE * 2, 0, NULL, 0));
}

2. 使用说明

ESP32 有3个 UART(UART0, UART1, and UART2),但 ESP32-S2 仅有2个 UART(UART0 and UART1)。

这里使用了 UART1,也使用过 UART0,但是发现好像不好用,不知道是否是因为 ESP32-S2 的控制台输出的默认 UART 为 URAT0 导致的,因为在源程序 console_uart.c 中有 #define CONSOLE_UART_NUM UART_NUM_0。

1)定义使用的UART为UART1:

const uart_port_t uart_num = UART_NUM_1;

2)判断使用的UART_NUM_x是否被占用

如果在程序中有多个用途要用uart,并且uart都为UART_NUM_1

例如:用途1:使用UART和NB-IoT BC26通信

          用途2:使用UART做各种传感器的测控

那么可以定义uart_init1() 和 uart_init2(), 每个uart配置不同的引脚PIN 和 不同的波特率, 也可以使用uart_init(),把各种要配置的引脚PIN、波特率等当做参数传入。但是多个UART都使用UART_NUM_1时,每次使用前应该判断UART_NUM_x是否已使用。

uart_is_driver_installed(uart_num);  // 是否已使用

uart_driver_delete(uart_num);         // 若已使用,删除uart驱动程序

3)设置UART参数

主要设置波特率,常用115200, 9600

uart_config_t uart_config = {
        .baud_rate = UART_BAUD_RATE,                         // 波特率
        .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_APB,                           //  UART 源时钟
    };

uart_param_config(uart_num, &uart_config);

4)设置通信引脚PIN

设置Tx、Rx、RTS 和 CTS 信号,这里只使用了Tx和Rx

uart_set_pin(uart_num, UART_TXD, UART_RXD, UART_RTS, UART_CTS);

5) 安装UART驱动程序

设置Tx缓存区大小,Rx缓存区大小,事件队列为NULL,没有使用

uart_driver_install(uart_num, UART_BUF_SIZE * 2, UART_BUF_SIZE * 2, 0, NULL, 0);

6) 发送和接收数据

char tx_data[512] = {0};                 // 自己赋值

uart_write_bytes(uart_num, (const char *) tx_data, strlen(tx_data));        //发送数据

int len = 0;

ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&len));  // 检测接收缓存区是否有返回数据

char rx_data[512] = {0};   

uart_read_bytes(uart_num, rx_data, len, 100);        // 读取数据,100:此参数为sTimeout,以 RTOS 滴答计数

ESP_IDF编程指南参考:Universal Asynchronous Receiver/Transmitter (UART) - ESP32-S2 - — ESP-IDF Programming Guide latest documentation

上一篇:Greenplum Sequence机制


下一篇:LeetCode 2002. 两个回文子序列长度的最大乘积 DFS+状态压缩DP