前言
本文旨在记录ESP32-S2的学习研究记录,实现ESP32-S2搭载NB-IoT BC26模块进行低功耗网络通信
目录
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