SOC-ESP32S3部分:18-串口

article/2025/8/29 1:25:06

飞书文档https://x509p6c8to.feishu.cn/wiki/NqrMw6X8Si6sSqkyPbxcFRxGnid

UART全称是通用异步接收器/发送器,ESP32-S3 芯片有 3 个 UART 控制器。每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。

串口文档参考:

https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4/esp32s3/api-reference/peripherals/uart.html

串口的使用分三步:

  1. 配置串口参数
  2. 设置串口管脚
  3. 安装驱动程序

配置串口参数

串口参数配置一般有两种方式,使用结构体一次性配置所有参数,或者使用API函数,逐个设置,可以根据具体情况灵活使用。

一次性配置有参数

调用函数 uart_param_config并向其传递 uart_config_t结构体,

uart_param_config用于配置 UART 的参数,包括波特率、数据位、校验位、停止位、流控和时钟源。
esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config);参数说明
uart_num (uart_port_t):指定要配置的 UART 端口号。ESP32 支持多个 UART 端口,通常使用 UART_NUM_0、UART_NUM_1 或 UART_NUM_2。
uart_config (const uart_config_t *):指向 uart_config_t 结构体的指针,包含要配置的 UART 参数。
返回值
ESP_OK: 成功配置 UART 参数。

uart_config_t 结构体应包含所有必要的参数。请参考以下示例。

    //配置 UART 参数,包括波特率、数据位、校验位、停止位、流控和时钟源。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,};//应用 UART 参数配置。uart_param_config(UART_NUM_0, &uart_config);

分步依次配置每个参数

调用下表中的专用函数,能够单独配置特定参数。如需重新配置某个参数,也可使用这些函数。 

配置参数函数
波特率uart_set_baudrate()
传输位调用 uart_set_word_length() 设置 uart_word_length_t
奇偶控制调用 uart_parity_t 设置 uart_set_parity()
停止位调用 uart_set_stop_bits() 设置 uart_stop_bits_t
硬件流控模式调用 uart_set_hw_flow_ctrl() 设置 uart_hw_flowcontrol_t
通信模式调用 uart_set_mode() 设置 uart_mode_t

设置串口管脚

通信参数设置完成后,可以配置其他 UART 设备连接的 GPIO 管脚。调用函数uart_set_pin,指定配置 Tx、Rx、RTS 和 CTS 信号的 GPIO 管脚编号。在ESP32S3中,串口IO可以通过软件配置到指定IO上,这使得我们在设计硬件电路时,非常灵活。

我们的板卡中,会使用GPIO43 GPIO44作为串口的TX和RX

uart_set_pin用于配置 UART 的引脚,该函数允许你指定 UART 的 TX(发送)和 RX(接收)引脚,
以及其他可选的 RTS(请求发送)和 CTS(清除发送)硬件流控引脚。函数原型
esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num);
参数说明
uart_num (uart_port_t):
指定要配置的 UART 端口号。ESP32 支持多个 UART 端口,
通常使用 UART_NUM_0、UART_NUM_1 或 UART_NUM_2。tx_io_num (int):
指定 TX(发送)引脚的 GPIO 编号。rx_io_num (int):
指定 RX(接收)引脚的 GPIO 编号。rts_io_num (int):
指定 RTS(请求发送)引脚的 GPIO 编号。如果不需要使用 RTS 引脚,可以设置为 UART_PIN_NO_CHANGEcts_io_num (int):
指定 CTS(清除发送)引脚的 GPIO 编号。如果不需要使用 CTS 引脚,可以设置为 UART_PIN_NO_CHANGE返回值
ESP_OK: 成功配置 UART 引脚。

使用参考

例如:设置串口0,对应的IO为TX: IO4, RX: IO5
uart_set_pin(UART_NUM_0, 4, 5, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

安装驱动程序

通信管脚设置完成后,请调用 uart_driver_install 安装驱动程序并指定以下参数:

  • UART 控制器编号
  • Tx 环形缓冲区的大小
  • Rx 环形缓冲区的大小
  • 指向事件队列句柄的指针
  • 事件队列大小
  • 分配中断的标志

该函数将为 UART 驱动程序分配所需的内部资源。

uart_driver_install 用于安装和初始化 UART 驱动程序。
esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *uart_queue, int intr_alloc_flags);
参数说明
uart_num (uart_port_t):指定要初始化的 UART 端口号。ESP32 支持多个 UART 端口,通常使用 UART_NUM_0、UART_NUM_1 或 UART_NUM_2。
rx_buffer_size (int):接收缓冲区的大小(以字节为单位)。如果设置为 0,则不使用接收缓冲区。
tx_buffer_size (int):发送缓冲区的大小(以字节为单位)。如果设置为 0,则不使用发送缓冲区。
queue_size (int):事件队列的大小。如果设置为 0,则不使用事件队列。
uart_queue (QueueHandle_t *):指向 QueueHandle_t 类型的指针,用于存储事件队列的句柄。如果 queue_size 为 0,则此参数可以为 NULL。
intr_alloc_flags (int):
中断分配标志,用于配置中断的属性。常见的取值包括:
ESP_INTR_FLAG_LEVEL1: 设置中断优先级为 1。
ESP_INTR_FLAG_LEVEL2: 设置中断优先级为 2。
ESP_INTR_FLAG_LEVEL3: 设置中断优先级为 3。
ESP_INTR_FLAG_LEVEL4: 设置中断优先级为 4。
ESP_INTR_FLAG_LEVEL5: 设置中断优先级为 5。
ESP_INTR_FLAG_LEVEL6: 设置中断优先级为 6。
ESP_INTR_FLAG_IRAM: 将中断处理程序和相关数据放在 IRAM 中,确保在 flash 休眠模式下仍能正常工作。
ESP_INTR_FLAG_SHARED: 允许多个中断源共享同一个中断处理程序。
返回值
ESP_OK: 成功安装 UART 驱动程序。

使用参考

例如:配置接收缓冲区大小为 1024,不使用发送缓冲区,不使用消息队列。
uart_driver_install(UART_NUM_0, 1024, 0, 0, NULL, 0);例如:配置接收缓冲区大小为 1024,发送缓冲区大小为512,使用消息队列,消息队列大小为10。
QueueHandle_t uart_queue;
uart_driver_install(UART_NUM_0, 1024, 512, 10, &uart_queue, 0);
使用队列参考:
esp-idf/examples/peripherals/uart/uart_events

最终程序

我们创建了两个任务,一个用于发送,一个用于接收

  • 发送任务每间隔2S往UART0发送字符串Hello world
  • 接收任务轮询读取接收缓冲区的数据,一旦读取到数据马上进行打印

#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 char *TAG = "UART"; // 定义日志标签static const int RX_BUF_SIZE = 1024;#define TXD_PIN (GPIO_NUM_43)
#define RXD_PIN (GPIO_NUM_44)
#define UART_NUM (UART_NUM_1)void init(void)
{//配置 UART 参数,包括波特率、数据位、校验位、停止位、流控和时钟源。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,};//应用 UART 参数配置。uart_param_config(UART_NUM, &uart_config);//设置 UART 引脚,指定 TX 和 RX 引脚,其他引脚保持不变。uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);//安装 UART 驱动程序,配置接收缓冲区大小为 RX_BUF_SIZE * 2,不使用发送缓冲区。uart_driver_install(UART_NUM, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
}static void tx_task(void *arg)
{while (1) {//发送字符串 "Hello PC"。char data[] = {"Hello PC"};const int len = strlen(data);//发送指定长度的数据到 UART。uart_write_bytes(UART_NUM, data, len);vTaskDelay(2000 / portTICK_PERIOD_MS);}
}static void rx_task(void *arg)
{uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE + 1);while (1) {// 从 UART 读取数据,最多读取 RX_BUF_SIZE 字节,等待时间最多 1000 毫秒(1 秒)。const int rxBytes = uart_read_bytes(UART_NUM, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);if (rxBytes > 0) {//在接收到的数据末尾添加空字符,使其成为有效的 C 字符串。data[rxBytes] = 0;ESP_LOGI(TAG, "Read %d bytes: %s", rxBytes, data);}vTaskDelay(10 / portTICK_PERIOD_MS);}free(data);
}void app_main(void)
{init();//rx_task: 任务名称为 "uart_rx_task",堆栈大小为 2048 字节。xTaskCreate(rx_task, "uart_rx_task", 1024 * 2, NULL, 1, NULL);//tx_task: 任务名称为 "uart_tx_task",堆栈大小为 2048 字节。 xTaskCreate(tx_task, "uart_tx_task", 1024 * 2, NULL, 1, NULL);while (1){vTaskDelay(pdMS_TO_TICKS(1000));}
}

然后把板卡的串口线接上,下图蓝色的线:

运行后,打开串口调试软件就可以接收到来自板卡的数据。

串口助手点击发送后,调试端会打印出接收到的hello ESP32数据,当然了,因为ESP32S3默认使用UART0作为日志口,所以UART0也会打印启动日志和hello ESP32

如果你不希望这个串口打印日志信息,那你可以绑定GPIO_NUM_43和GPIO_NUM_44到其它串口,例如UART_NUM_1上。

#define TXD_PIN (GPIO_NUM_43)
#define RXD_PIN (GPIO_NUM_44)
#define UART_NUM (UART_NUM_1)

http://www.hkcw.cn/article/XtnRBJCjFW.shtml

相关文章

纯数据挖掘也能发Microbiome?

抗生素滥用导致多重耐药微生物在全球蔓延,但新型抗生素的研发进展缓慢,亟需找到替代抗生素的新型防御策略。抗菌肽(AMPs)作为天然防御分子,具有低耐药潜力和广谱活性。德国小蠊(Blattella germanica&#x…

Apache Airflow

目录 Apache Airflow是什么 CVE-2020-11978(Airflow 示例dag中的命令注入) CVE-2020-11981(Airflow Celery消息中间件命令执行) CVE-2020-17526(Airflow 默认密钥导致的权限绕过) Apache Airflow是什么 Airflow是一个以编程方式编写,安排和监视工作流的平台。 …

word添加页眉

问题一: 为word文档添加页眉。 方法: 1、在要添加页眉的第一页页面顶端双击页眉区域,如果添加页眉页上面还有其他页或者与上一页添加页眉内容不同,记得取消“链接到前一节”(点击使其上面没有灰色即可)&…

word为跨页表格新加表头和表名

问题: 当表格过长需要跨页时(如下图所示),某些格式要求需要转页接排加续表。 方法一: 1、选中表格,在“表布局”区域点开“自动调整”,选择“固定列宽”(防止后续拆分表格后表格变…

C# 导出word 插入公式问题

最近遇到了一个问题,下载一个文档时需要下载word可编辑的公式。找了很久终于找到了一种解决办法。下面是以C#代码来实现在Word中插入公式的功能。 目录 一、引入dll程序集文件1、通过 NuGet 引入dll(2种方法)的方法:2、手动添加d…

GitHub 汉化插件,GitHub 中文化界面安装全教程

概述 GitHub作为全球最大的代码托管平台,拥有庞大的用户群体。对于中文用户来说,如果能将GitHub界面汉化,将大大提高使用体验和工作效率。本文将详细介绍如何通过安装汉化插件,实现GitHub界面的中文化。 感谢maboloshi作者的无私奉…

红 黑 树

AVL树是严格平衡的。 红⿊树是⼀棵⼆叉搜索树。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍&#xff0c;因⽽是接近平衡的。即最长路径<最短路径的2倍。 红黑树规则&#xff1a; 1. 每个结点不是红⾊…

[ Qt ] | Qlabel使用

目录 属性 setTextFormat 插入图片 设置图片根据窗口大小实时变化 边框和对其方式 ​编辑 设置缩进 设置伙伴 Qlabel可以用来显式图片和文字 属性 text textFormat Qlabel独有的机制&#xff1a;buddy setTextFormat 插入图片 设置图片根据窗口大小实时变化 Qt中表…

智能座舱产品安全标准

目录 一、导览 二、意向 一、导览 国内近几年的电动汽车发展迅速&#xff0c;2024年4月16日&#xff0c;工信部装备工业一司组织主要汽车生产企业、部装备工业发展中心等近60名代表召开专题会议&#xff0c;重点落实《关于进一步加强智能网联汽车产品准入、召回及软件在线升级…

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)

一、责任链模式核心概念解析 &#xff08;一&#xff09;模式定义与本质 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个处理者对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有某…

Sentieon项目文章 | 社区努力识别和纠正蛋白质基因组研究中标签错误的样本

关键词&#xff1a;多组学&#xff1b;蛋白质&#xff1b;错误标记&#xff1b; 引言 在日常生活中&#xff0c;会经常遇到物品与标签错误的问题&#xff0c;比如超市商品标价错误、图书馆书籍分类错误等。都会造成一些后果。在生物医学研究领域中&#xff0c;蛋白质样本标记错…

git reset --hard HEAD~1与git reset --hard origin/xxx

git reset --hard HEAD~1与git reset --hard origin/xxx git reset --hard origin/xxx有时候会太长&#xff0c;手工输入略微繁琐&#xff0c;可以考虑&#xff1a; git reset --hard HEAD~1 替代。 或者使用这种方式 git reset撤销当前分支所有修改&#xff0c;恢复到最近一…

Kotlin委托机制使用方式和原理

目录 类委托属性委托简单的实现属性委托Kotlin标准库中提供的几个委托延迟属性LazyLazy委托参数可观察属性Observable委托vetoable委托属性储存在Map中 实践方式双击back退出Fragment/Activity传参ViewBinding和委托 类委托 类委托有点类似于Java中的代理模式 interface Base…

2025年能源科学与农业发展国际会议:共创可持续农业未来

会议简介 第二届能源环境科学与农业发展国际会议即将在武汉盛大召开。此次盛会定于武汉这一中部地区的中心城市举办&#xff0c;旨在汇聚国内外能源环境科学与农业发展的专家学者、企业家及各界精英&#xff0c;共同探讨能源资源的高效利用、环境保护的科技创新以及农业可持续发…

MongoDB(七) - MongoDB副本集安装与配置

文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…

未来楼宇自控系统升级优化,为绿色建筑发展注入更强动力支撑

在全球积极应对气候变化、大力推进节能减排的时代背景下&#xff0c;建筑行业作为能源消耗和碳排放的重点领域&#xff0c;其绿色转型迫在眉睫。绿色建筑旨在减少对环境的负面影响&#xff0c;实现资源高效利用&#xff0c;而楼宇自控系统作为建筑智能化的核心组成部分&#xf…

【SQL Server Management Studio 连接时遇到的一个错误】

第一次用SQL Server Management Studio启动之后第一步就是要建立连接 但是不知道Server Name要填什么&#xff0c;看了网上的教程说是要找到下面这个注册表中对应的实例名称填上去&#xff0c;或者前面加localhost 但是好像都没有用&#xff0c;一直遇到报错如下&#xff1a;…

华为云Flexus+DeepSeek征文 | 初探华为云ModelArts Studio:部署DeepSeek-V3/R1商用服务的详细步骤

华为云FlexusDeepSeek征文 | 初探华为云ModelArts Studio&#xff1a;部署DeepSeek-V3/R1商用服务的详细步骤 前言一、华为云ModelArts Studio平台介绍1.1 ModelArts Studio介绍1.2 ModelArts Studio主要特点1.3 ModelArts Studio使用场景1.4 ModelArts Studio产品架构 二、访问…

【Redis】string 类型

string 一. string 类型介绍二. string 命令set、getmget、msetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappend、getrange、setrange、strlen 三. string 命令小结四. string 内部编码方式五. string 的应用场景缓存功能计数功能共享会话手机验证码 六. 什…

字体查看器

为了快速找到0不带点、斜杠的等宽字体&#xff0c;我做了个软件&#xff01; sonichy/HTYFontViewer