当前位置: 首页 > news >正文

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解

USART简介

USART是一种串行通信协议,广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式,因此它可以在没有时钟信号的情况下(异步模式)或有时钟信号的情况下(同步模式)进行通信。

ESP32-S3的USART

ESP32-S3有两个全功能的USART通道,USART0和USART1,USART2,支持异步通信(RS232 和 RS485)和 IrDA,通信速率可达到 5 Mbps。

UART 基本架构图
在这里插入图片描述
UART 模块工作在两个时钟域:APB_CLK 时钟域和 Core 时钟域。UART Core 有三个时钟源:80-MHz APB_CLKRC_FAST_CLK 以及晶振时钟 XTAL_CLK ,可以通过配置 UART_SCLK_SEL 来选择时钟源。分频器用于对时钟源进行分频,然后产生时钟信号来驱动 UARTCore 模块。

更加详细的介绍,可以去看看官方的文档:
ESP32S3官方文档

需要注意一点
ESP32-S3的USART引脚映射是可配置的,这是因为ESP32-S3使用了一个称为GPIO矩阵的特性。GPIO矩阵是ESP32-S3硬件的一部分,它允许将内部信号路由到任何GPIO引脚。这意味着,我们可以将USART的发送(TX)和接收(RX)信号连接到你选择的任何可用GPIO引脚。

ESP32-S3 UART的默认引脚

发送(TX)接收(RX)
UART0IO43IO44
UART1IO17 / 任意IOIO18 / 任意IO
UART2任意IO任意IO

printf()函数

在ESP-IDF中,printf()函数默认使用的是USART0。这是因为在ESP32-S3的启动代码中,USART0被初始化为默认的调试控制台。因此,当我们在代码中使用printf()函数来打印信息时,这些信息将会被发送到USART0,并且可以通过串行接口(如USB转串口适配器)在计算机的串行监视器上看到。

使用ESP-IDF配置USART

在ESP32-S3上使用USART的基本步骤:

  • 设置 UART 参数、分配引脚(可选,不配置则使用默认引脚)
  • 初始化UART
  • 安装 UART 驱动
  • 收发数据
  • 使用中断
  • 卸载 UART 中断驱动,释放资源(当 UART 不再使用时)
#include "driver/uart.h"void app_main(void)
{// -------------1. 配置USART选项-----------------------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 // 流控};// --------------2. 初始化USART------------------------// UART_NUM_1:UART端口号// &uart_config:指向uart_config_t结构体的指针uart_param_config(UART_NUM_1, &uart_config);// --------------3. 安装驱动程序------------------------// UART_NUM_1:UART端口号// 1024 * 2:接收缓冲区大小// 0:发送缓冲区大小// 0:队列长度// NULL:队列句柄(如果不使用队列,可以设置为NULL)// 0:中断分配标志(通常设置为0)uart_driver_install(UART_NUM_1, 1024 * 2, 0, 0, NULL, 0);// 4.---------------4. 发送数据--------------------------// UART_NUM_1:UART端口号// "Hello, world!":要发送的数据// 13:要发送的数据的长度uart_write_bytes(UART_NUM_1, "Hello, world!", 13);// ------------------5. 读取数据-----------------------uint8_t data[128]; // 数据缓冲区int length = 0; // 读取的数据长度// UART_NUM_1:UART端口号// data:数据缓冲区// sizeof(data):要读取的最大数据长度// 1000 / portTICK_RATE_MS:读取超时时间(以RTOS tick为单位)length = uart_read_bytes(UART_NUM_1, data, sizeof(data), 1000 / portTICK_RATE_MS);if (length > 0) {// 如果读取到数据,处理数据// ...}}

前面提到过ESP32-S3的USART引脚映射是可配置的,所以我们可以使用uart_set_pin()来自定义TX和RX

#include "driver/uart.h"void app_main(void)
{// 设置UART1的TX引脚为GPIO10,RX引脚为GPIO9uart_set_pin(UART_NUM_1, 10, 9, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}

这里uart_set_pin()函数的最后两个参数是RTS(请求发送)和CTS(清除发送),我没有使用所以将它们设置为UART_PIN_NO_CHANGE

USART实验

在这里插入图片描述
串口UART_NUM_1接收数据,并分别在串口UART_NUM_0和串口UART_NUM_1返回

这次我们依旧使用面向对象的方法来编写驱动,驱动API接口参考Arduino的格式

USART.h

/*** @file USART.h* @author 宁子希 (1589326497@qq.com)* @brief   串口初始化类* @version 0.1* @date 2024-03-12* * @copyright Copyright (c) 2024* */#ifndef _USART_H_
#define _USART_H_#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/uart_select.h"
#include "driver/gpio.h"#ifdef __cplusplusextern "C" {
#endifclass Uart {
public:// 构造函数,接收UART端口号和TX、RX引脚作为参数Uart(uart_port_t uart_num, int tx_pin, int rx_pin);// 发送数据,接收一个字符数组和长度作为参数void write(const char* data, int len);// 接收数据,接收一个字符数组和长度作为参数,返回实际接收的长度int read(uint8_t* buf, int len);private:uart_port_t _uart_num; // UART端口号int _tx_pin; // TX引脚int _rx_pin; // RX引脚
};#ifdef __cplusplus}
#endif#endif

USART.cpp

/*** @file USART.cpp* @author 宁子希 (1589326497@qq.com)* @brief   串口初始化类* @version 0.1* @date 2024-03-12* * @copyright Copyright (c) 2024* */
#include "USART.h"// 构造函数
Uart::Uart(uart_port_t uart_num, int tx_pin, int rx_pin): _uart_num(uart_num), _tx_pin(tx_pin), _rx_pin(rx_pin) {// 配置UART参数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, // 流控制};// 配置UART参数uart_param_config(uart_num, &uart_config);// 设置UART引脚// 设置UART的TX和RX引脚uart_set_pin(uart_num, tx_pin, rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);// 安装UART驱动程序// 安装UART驱动程序uart_driver_install(uart_num, 1024 * 2, 0, 0, NULL, 0);
}// 发送数据
void Uart::write(const char* data, int len) {// 调用ESP-IDF库函数来发送数据uart_write_bytes(_uart_num, data, len);
}// 接收数据
int Uart::read(uint8_t* buf, int len) {// 调用ESP-IDF库函数来接收数据return uart_read_bytes(_uart_num, buf, len, 1000 / portTICK_PERIOD_MS);
}

main.cpp

/*** @file main.cpp* @author 宁子希 (1589326497@qq.com)* @brief   串口通信实验* @version 0.1* @date 2024-03-13* * @copyright Copyright (c) 2024* */#include <iostream>
#include <string>
#include "USART.h"
using namespace std;extern "C" void app_main(void){// 创建一个Uart对象使用UART_NUM_1 TX:8 RX:9Uart uart1(UART_NUM_1, 8, 9);// 发送数据uart1.write("Hello, ESP32!", 13);while(true){// 接收数据uint8_t buf[128];int len = uart1.read(buf, sizeof(buf));// 处理接收到的数据if (len > 0) {// 假设我们只是简单地将接收到的数据打印出来for (int i = 0; i < len; i++) {printf("%c", buf[i]);}printf("\n");// 然后我们可以再次发送处理后的数据uart1.write((const char*)buf, len);}}
}

总结

更加详细的内容可以去看看官方的资料:
ESP32S3 USART 官方手册

相关文章:

05-ESP32-S3-IDF USART

ESP32-S3 IDF USART详解 USART简介 USART是一种串行通信协议&#xff0c;广泛应用于微控制器和计算机之间的通信。USART支持异步和同步模式&#xff0c;因此它可以在没有时钟信号的情况下&#xff08;异步模式&#xff09;或有时钟信号的情况下&#xff08;同步模式&#xff…...

安塔利斯升级php8

1、includes/classes/class.Database.php 255行 multi_query方法加返回类型 :bool query方法加返回类型&#xff1a;: mysqli_result|bool 2、includes/classes/class.Session.php on line 91 Optional parameter $planetID declared before required parameter $dpath is…...

Clickhouse MergeTree 原理(一)

作者&#xff1a;俊达 MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎&#xff08;见下图&#xff09;&#xff0c;理解了基础MergeTree&#xff0c;就能理解整个系列的MergeTree引擎的核心原理。 本文对MergeTree的基本原理进行介绍…...

【C语言】字符串函数上

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数上篇&#xff0c;主要是关于长度不受限制的字符串函数&#xff08;strlen,strcpy,strcat,strcm…...

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口&#xff0c;定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理&#xff0c;还添加了面向位置的操作。 实际上有两种list&#xff1a;一种是基本的ArrayList&#xff0c;其优点在于随机访问元素&#xff0c;另一种是更强大的L…...

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量&#xff0c;或将一个普通变量导出为环境变量&#xff0c;并且在这个过程中&#xff0c;可以给该环境变量赋值。 下面…...

案例--某站视频爬取

众所周知&#xff0c;某站的视频是&#xff1a; 由视频和音频分开的。 所以我们进行获取&#xff0c;需要分别获得它的音频和视频数据&#xff0c;然后进行音视频合并。 这么多年了&#xff0c;某站还是老样子&#xff0c;只要加个防盗链就能绕过。&#xff08;防止403&#xf…...

清华把大模型用于城市规划,回龙观和大红门地区成研究对象

引言&#xff1a;参与式城市规划的新篇章 随着城市化的不断推进&#xff0c;传统的城市规划方法面临着越来越多的挑战。这些方法往往需要大量的时间和人力&#xff0c;且严重依赖于经验丰富的城市规划师。为了应对这些挑战&#xff0c;参与式城市规划应运而生&#xff0c;它强…...

Vue+SpringBoot打造创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…...

Web框架开发-Django简介

一、MVC和MTV模型 MVC 所谓MVC就是把web应用分为模型&#xff08;M&#xff09;&#xff0c;控制器&#xff08;C&#xff09;和视图&#xff08;V&#xff09;三层&#xff0c;他们之间以一种插件式的&#xff0c;松耦合的方式连接在一起&#xff0c;模型负责业务对象与数据库…...

VB播放器(动态服务器获取歌词)-183-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword183 VBASP vb动态从服务器读取歌词 VB asp交互 程序, 模式不一样, 与普通的MP3播放器不一样, 这个是可以实现歌词从服务器上查询功能的. 看好了在咨询 我可以給您演示 目  录 前  言 1 1 . 简述 2 1.1 开发…...

java-可变参数

可变参数是什么&#xff1f; 可变参数就是指传入的参数个数是可变的&#xff0c;不是固定的 为什么要可变参数&#xff1f; 当我们要传入大量的形参时&#xff0c;我们就可以用到可变参数了 定义格式 数据类型...变量名; 例如int ...a; 可变参数的细节&#xff1a; &…...

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…...

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …...

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计

三维抄数技术在科研三维模型的应用已经日益广泛&#xff0c;其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量&#xff0c;再将这些数据转化为三维数字模型&#xff0c;为后续的研究提供…...

【LeetCode热题100】141. 环形链表(链表)

一.题目要求 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…...

express+mysql+vue,从零搭建一个商城管理系统11--使用Sequelize

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装sequelize和mysql2二、修改config/db.js三、修改models/user.js&#xff0c;models/shop.js&#xff0c;models/goods.js四、新建dao/user.js&#xff0c;dao/shop.js&#xff0c;dao/goods.js五、修…...

霹雳学习笔记——6.1 ResNet网络结构、BN以及迁移学习

一、ResNet结构 ResNet是一个突破一千层的网络架构。主要是卷积层Conv和池化层的堆叠。但是普通的堆叠会使得错误率更高&#xff0c;如下图所述&#xff0c;这是因为会产生梯度消失/梯度爆炸等。&#xff08;梯度就是增量&#xff0c;有大小有方向&#xff09; 解决方法&#…...

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…...

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…...

无字母数字webshell的命令执行

在Web安全领域&#xff0c;WebShell是一种常见的攻击手段&#xff0c;通过它攻击者可以远程执行服务器上的命令&#xff0c;获取敏感信息或控制系统。而无字母数字WebShell则是其中一种特殊形式&#xff0c;通过避免使用字母和数字字符&#xff0c;来绕过某些安全机制的检测。 …...

Mysql的卸载与安装

确保卸载干净mysql 不然在进行mysal安装时候会出现不一的页面和问题 1、卸载 在应用页面将查询到的mysql相关应用卸载 2、到c盘下将残留的软件包进行数据删除 3、删除programData下的mysql数据 4、检查系统中的mysql是否存在 cmd中执行 sc deleted mysql80 5、删除注册表中的…...

Github 2025-06-06 Java开源项目日报Top10

根据Github Trendings的统计,今日(2025-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1Java实现的算法集合:使用Gitpod.io进行编辑和贡献 创建周期:2883 天开发语言:Java协议类型:MIT LicenseStar数量…...

从混乱到秩序:探索管理系统如何彻底改变工作流程

内容摘要 在许多企业与组织中&#xff0c;工作流程混乱是阻碍发展的“绊脚石”。员工们常常被繁琐的步骤、模糊的职责和沟通不畅等问题搞得焦头烂额&#xff0c;工作效率低下&#xff0c;错误频发。而与之形成鲜明对比的是&#xff0c;一些引入了先进管理系统的团队&#xff0…...

JMM初学

文章目录 1,线程间的同步和通信1.1, 共享内存并发模型 (Shared Memory Model)线程通信机制线程同步机制特点 1.2, 消息传递并发模型 (Message Passing Model)线程通信机制线程同步机制特点 适用场景对比 2,Java内存模型JMM2.0,Java内存模型的基础&#xff08;1&#xff09;内存…...

React 第五十六节 Router 中useSubmit的使用详解及注意事项

前言 useSubmit 是 React Router v6.4 引入的强大钩子&#xff0c;用于以编程方式提交表单数据。 它提供了对表单提交过程的精细控制&#xff0c;特别适合需要自定义提交行为或非标准表单场景的应用。 一、useSubmit 核心用途 编程式表单提交&#xff1a;不依赖 <form>…...

USB扩展器与USB服务器的2个主要区别

在现代办公和IT环境中&#xff0c;连接和管理USB设备是常见需求。USB扩展器&#xff08;常称USB集线器&#xff09;与USB服务器&#xff08;如朝天椒USB服务器&#xff09;是两类功能定位截然不同的解决方案。前者主要解决物理接口数量不足的“近身”连接扩展问题&#xff0c;而…...

使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools

&#x1f4cc; 引言 随着大语言模型&#xff08;LLM&#xff09;的发展&#xff0c;AI 已经不再只是“回答问题”的工具&#xff0c;而是可以主动执行任务、调用外部资源、甚至构建完整工作流的智能系统。 为了更好地理解和使用这些能力&#xff0c;我们需要了解 AI 交互中几…...

mac 电脑Pycharm ImportError: No module named pip

这个错误表明 PyCharm 在尝试使用 pip 时找不到该模块,通常是由于 Python 环境中的 pip 未正确安装或损坏引起的。以下是针对 Mac 系统的完整解决方案: 解决方案步骤: 检查终端中的 pip 状态 打开终端(Terminal),执行以下命令: bash python3 -m ensurepip --upgrade pi…...