ESP32-S3入门第七天:UART串口通信与设备交互 - 教程

news/2025/10/24 19:25:48/文章来源:https://www.cnblogs.com/yxysuanfa/p/19164099

ESP32-S3 入门第七天:UART 串口通信与设备交互

一、今日目标

二、UART 通信核心原理

1. 协议特性与优势

UART 是一种异步串行通信协议,无需时钟线即可实现设备间的数据传输,核心特点:

2. ESP32-S3 的 UART 硬件特性

特性参数说明备注
控制器数量3 个(UART0/UART1/UART2)UART0 默认映射到 USB 串口(调试用)
通信速率300bps - 5Mbps常用 9600/115200/921600bps
数据帧格式可配置:8/9 位数据位、0/1 位停止位、无 / 奇 / 偶校验位默认 8N1(8 数据位 + 无校验 + 1 停止位)
引脚映射支持任意 GPIO 重映射需避免与其他外设冲突
缓冲区大小发送 / 接收缓冲区各 256 字节可通过软件扩展

3. 数据传输原理

UART 数据以「帧」为单位传输,典型 8N1 帧结构:

  1. 起始位:1 位低电平(标志数据开始)
  2. 数据位:8 位(高位在前或低位在前,可配置)
  3. 校验位:0 位(无校验,用于验证数据正确性)
  4. 停止位:1 位高电平(标志数据结束)
    在这里插入图片描述

三、基础实验:UART 回环测试(验证通信功能)

1. 实验原理

通过短接 UART 的 TX 和 RX 引脚,使发送的数据直接被自身接收,验证 UART 收发功能是否正常。

2. 硬件准备

元件数量说明
ESP32-S3 开发板1 块核心控制板
杜邦线1 根短接 TX 和 RX

3. 硬件连接(使用 UART2)

ESP32-S3 引脚功能连接方式
GPIO17UART2_TX与 GPIO16 短接
GPIO16UART2_RX与 GPIO17 短接

注意:UART0 默认用于 USB 调试(Serial 对象),本实验用 UART2 做回环测试,避免冲突。
在这里插入图片描述

4. 代码实现(UART2 回环测试)

// 定义UART2引脚(可自定义映射)
#define UART2_TX 17
#define UART2_RX 16
// 创建UART2对象(硬件UART)
HardwareSerial UART2(2);  // 2对应UART2控制器
void setup() {
// 初始化UART0(USB串口,用于打印日志)
Serial.begin(115200);
while (!Serial);  // 等待USB串口就绪
// 初始化UART2(波特率9600,8N1格式)
UART2.begin(9600, SERIAL_8N1, UART2_RX, UART2_TX);
Serial.println("UART2回环测试开始(TX=17,RX=16)");
Serial.println("发送数据 | 接收数据");
Serial.println("---------------------");
}
void loop() {
// 测试数据(0x00到0xFF循环)
static byte testData = 0x00;
// 发送数据
UART2.write(testData);
Serial.print("  0x");
if (testData < 0x10) Serial.print("0");
Serial.print(testData, HEX);
// 等待接收数据(超时100ms)
delay(10);
if (UART2.available() > 0) {
byte recvData = UART2.read();
Serial.print("   |   0x");
if (recvData < 0x10) Serial.print("0");
Serial.println(recvData, HEX);
} else {
Serial.println("   |   接收超时");
}
// 数据递增,循环测试
testData++;
delay(500);
}

5. 实验现象

USB 串口监视器显示发送数据与接收数据完全一致(因 TX 与 RX 短接),证明 UART2 通信功能正常:

UART2回环测试开始(TX=17,RX=16)
发送数据 | 接收数据
---------------------0x00   |   0x000x01   |   0x010x02   |   0x02...

四、进阶实验:串口指令控制硬件(LED + 舵机)

1. 实验原理

通过电脑串口助手发送指令(如 “LED ON”“SERVO 90”),ESP32-S3 接收并解析指令,控制 LED 开关和舵机角度,实现人机交互。

2. 硬件准备

元件数量说明
板载 LED(GPIO48)1 个状态指示
舵机(SG90)1 个角度控制
杜邦线3 根舵机连接

3. 硬件连接

设备ESP32-S3 引脚说明
舵机信号GPIO13PWM 控制(复用第三天知识)
舵机 VCC5V独立供电
舵机 GNDGND共地
UART 指令接收UART0(USB 串口)直接用开发板 USB 口

4. 代码实现(指令解析与硬件控制)

#include <Servo.h>// 舵机配置Servo myServo;#define SERVO_PIN 13// LED配置#define LED_PIN 48void setup() {// 初始化USB串口(UART0,波特率115200)Serial.begin(115200);while (!Serial);// 初始化硬件pinMode(LED_PIN, OUTPUT);myServo.attach(SERVO_PIN);  // 舵机初始化Serial.println("串口指令控制实验");Serial.println("支持指令:");Serial.println("  LED ON  - 点亮LED");Serial.println("  LED OFF - 熄灭LED");Serial.println("  SERVO X - 舵机转到X度(0-180)");}void loop() {// 等待接收串口指令if (Serial.available() > 0) {String cmd = Serial.readStringUntil('\n');cmd.trim();  // 去除空格和换行符// 解析LED控制指令if (cmd == "LED ON") {digitalWrite(LED_PIN, HIGH);Serial.println("指令执行:LED已点亮");} else if (cmd == "LED OFF") {digitalWrite(LED_PIN, LOW);Serial.println("指令执行:LED已熄灭");}// 解析舵机控制指令else if (cmd.startsWith("SERVO ")) {int angle = cmd.substring(6).toInt();  // 提取角度值if (angle >= 0 && angle <= 180) {myServo.write(angle);Serial.print("指令执行:舵机转到");Serial.print(angle);Serial.println("度");} else {Serial.println("错误:角度需在0-180之间");}}// 未知指令处理else {Serial.print("错误:未知指令「");Serial.print(cmd);Serial.println("」");}}delay(50);}

5. 实验操作与现象

  1. 打开电脑串口助手(如 Arduino IDE 串口监视器),设置波特率 115200,换行符选 “Newline”
  2. 发送指令 “LED ON”→ 板载 LED 点亮,串口返回 “指令执行:LED 已点亮”
  3. 发送指令 “SERVO 90”→ 舵机转到 90° 中位,串口返回角度确认信息
  4. 发送无效指令→ 串口返回错误提示

五、实战项目:多串口协同 —— 传感器数据上报

1. 实验原理

用 UART0(USB)打印调试日志,UART1 连接 DHT11 温湿度传感器(模拟外设),UART2 将传感器数据上报到上位机,实现多串口分工协作。

2. 硬件连接(三串口同时工作)

UART 控制器功能引脚分配连接设备
UART0调试日志TX=1, RX=3(USB 内置)电脑 USB
UART1传感器通信TX=10, RX=9DHT11(模拟外设)
UART2数据上报TX=17, RX=16上位机(电脑串口助手)

3. 代码实现(多串口数据流转)

#include "DHT.h"
// DHT11配置(接UART1 RX,模拟串口传感器)
#define DHT_PIN 9
#define DHT_TYPE DHT11
DHT dht(DHT_PIN, DHT_TYPE);
// 多UART定义
HardwareSerial UART1(1);  // 传感器通信
HardwareSerial UART2(2);  // 数据上报
void setup() {
// 初始化各UART
Serial.begin(115200);    // UART0:调试
UART1.begin(9600, SERIAL_8N1, DHT_PIN, 10);  // UART1:RX=9, TX=10
UART2.begin(115200, SERIAL_8N1, 16, 17);     // UART2:RX=16, TX=17
// 初始化传感器
dht.begin();
Serial.println("多串口协同实验启动");
Serial.println("UART0:调试日志 | UART1:传感器 | UART2:数据上报");
}
void loop() {
// 1. 读取DHT11数据(模拟UART传感器)
float temp = dht.readTemperature();
float humi = dht.readHumidity();
// 2. UART0打印调试信息
Serial.print("\n【调试日志】");
Serial.print("温度:");
Serial.print(temp);
Serial.print("℃,湿度:");
Serial.print(humi);
Serial.println("%");
// 3. UART2上报数据到上位机(格式:TEMP:25.5,HUMI:60.2)
String report = "TEMP:" + String(temp) + ",HUMI:" + String(humi);
UART2.println(report);
Serial.print("【UART2上报】");
Serial.println(report);
// 4. 模拟UART1接收传感器反馈
if (UART1.available() > 0) {
String feedback = UART1.readString();
Serial.print("【UART1接收】");
Serial.println(feedback);
}
delay(2000);
}

4. 实验现象

  • UART0(USB 串口):每 2 秒打印调试日志,包含温湿度和各串口状态
  • UART2(数据上报):同步发送格式化数据(如 “TEMP:25.6,HUMI:60.1”),可在串口助手接收
  • 多串口同时工作,无数据冲突或丢失

六、UART 高级配置与故障排除

1. 关键配置技巧

(1)自定义波特率与数据格式
// 非常规波特率(如4800bps)
Serial.begin(4800);
// 自定义数据格式(9位数据位+奇校验+2停止位)
UART1.begin(9600, SERIAL\_9O2, RX\_PIN, TX\_PIN);
(2)引脚重映射(任意 GPIO 分配)
// UART1重映射:TX=21, RX=22(原I2C引脚,可复用)
HardwareSerial UART1(1);
UART1.begin(9600, SERIAL\_8N1, 22, 21);  // 顺序:波特率、格式、RX、TX
(3)缓冲区操作(避免数据丢失)
// 检查接收缓冲区大小
if (Serial.available() > 0) {String data = Serial.readString();  // 读取所有缓存数据
}
// 清空发送缓冲区
Serial.flush();

2. 常见问题与解决方案

问题现象可能原因解决方法
数据乱码1. 波特率不匹配2. 数据格式(校验位 / 停止位)错误1. 确保双方波特率完全一致(如均为 115200)2. 统一配置为 8N1(默认常用格式)
接收不到数据1. TX/RX 引脚接反2. 引脚映射错误3. 外设未上电1. 交叉连接:A 的 TX 接 B 的 RX,A 的 RX 接 B 的 TX2. 重新核对 UART 初始化时的 RX/TX 引脚顺序3. 检查外设电源和 GND 连接
数据丢失1. 接收缓冲区溢出2. 处理速度慢于接收速度1. 缩短数据帧长度,或增加处理频率2. 用readStringUntil()按分隔符读取,避免缓存堆积
多串口冲突1. 引脚复用冲突2. 硬件资源竞争1. 确保不同 UART 使用独立 GPIO(用引脚图排查冲突)2. 避免同时在多个 UART 中使用delay()阻塞

七、第七天总结与第XXX天预告

1. 今日成果

  • ✅ 理解 UART 异步通信原理、数据帧结构和波特率同步机制
  • ✅ 掌握 ESP32-S3 3 个硬件 UART 的配置、引脚映射和多串口协同
  • ✅ 实现指令控制硬件、传感器数据上报等实用场景,理解 UART 交互逻辑

2. 第XXX天预告:Wi-Fi 基础与网络连接

明天将进入物联网核心模块 ——Wi-Fi 通信,学习:


本章节系列教学

ESP32-S3 入门第一天:Arduino IDE使用
ESP32-S3 入门第二天:IO口、延时与定时器核心知识实战
ESP32-S3 入门第三天:PWM 脉冲宽度调制
ESP32-S3 入门第四天:ADC 模数转换
ESP32-S3 入门第五天:I2C通信协议
ESP32-S3入门第六天:SPI通信协议与高速外设控制
ESP32-S3入门第七天:UART串口通信与设备交互
ESP32-S3入门第八天:往期知识回顾与实战练习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字人:数字人公司深度解析与未来展望

数字人企业 数字人企业新趋势:虚拟与现实的融合探索 数字人企业深度解析与未来展望 在当今科技飞速发展的时代,数字人企业正成为推动创新与变革的重要力量。数字人,作为虚拟与现实交互的桥梁,不仅改变了人机交互的…

CSP/NOIP 复习:单调栈

最近模拟赛打的都不是太好,先随便复习复习吧,马上就要 CSPS 了,我可以考好的。 这里放一些单调栈的题目,笛卡尔树先不说,这个我已经忘了,后天复习一下。 本体 栈中维护有单调性的数据,入栈时维护这个单调性,这…

数字人企业:数字人公司排行榜深度解析

数字人企业新纪元:创新科技重塑未来生态 探秘数字人企业的核心驱动力与市场前景 数字人企业排行榜深度解析与趋势洞察 正文: 在数字化浪潮席卷全球的今天,数字人企业正成为科技领域的一颗新星,推动着虚拟与现实的深…

数字人公司:数字人新趋势技术驱动与市场前景解析

数字人企业 数字人企业新趋势:技术驱动与市场前景解析 数字人企业排行榜与深度点评 在当今科技飞速发展的时代,数字人企业正成为人工智能和虚拟交互领域的热门焦点。这些企业通过创新技术,推动着虚拟数字人在娱乐、…

算法分析--生成排列

排列简介全排列,有顺序要求。 递归实现如何实现查找第u位置有哪些数字可以用,选择查到的第一个,填上去。if(u > n){for(int i=1;i<=n;i++)cout<<path[i]<<" ";cout<<endl; }再去…

三大安全认证授权协议深度对比:OAuth、OpenID Connect与SAML

本文深入解析OAuth、OpenID Connect和SAML三大主流安全认证协议的技术原理、架构差异与应用场景,帮助开发者在Web应用中实现安全可靠的身份验证与授权机制,涵盖协议流程、安全机制对比及最佳实践建议。安全认证与授权…

数据绑定相关概念理解

中文译本将 Data Binding 译为了数据绑定,很大程度上其实是拼音音译,没有实际意义。WPF 中的Binding 更多地是表达一种桥梁关系。Binding 对象的两端,分别是源(Source)和目标(Target),源即数据来源,目标就是数据要…

数字人企业:数字人公司排行榜Top 3解析

数字人企业:探索行业创新与未来趋势 数字人企业的崛起与发展洞察 数字人企业排行榜Top 3解析 在数字人领域,众多企业凭借技术实力和市场表现脱颖而出。根据综合评估,以下是当前表现突出的三家数字人企业,优先以像衍…

WPF 深入系列.2.布局环境.布局控件.Grid

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

(简记)(自用)线段树区间拆分时间复杂度证明

如题,假定整数域线段树初始区间 \([1,n]\),每次划分长度不为 \(1\) 的区间 \([l,r]\) 会找到 \(mid=\lfloor\frac{l+r}{2}\rfloor\),划分成 \([l,mid],[mid+1,r]\)。求证划分任意合法区间 \([L,R]\) 最多使用 \(O(\…

冬日绘板 2026 珂朵莉计划 如何获取 Token

冬日绘板是全国 OIer 的一项社交活动,一般于每年元旦春节进行,主要博弈目标为获取更多的 tokens。形式类似于曾经的 bilibili 夏日绘板,游玩例子见 2024冬日绘版回忆录——听取MLE声一片。 冬日绘板 2026 珂朵莉计划…

数字人企业:数字人公司技术驱动的三大标杆

数字人企业:AI浪潮下的产业新势力 从技术突破到商业落地,数字人企业如何重塑行业生态 像衍科技领衔,数字人企业开启三维交互新纪元 一、数字人企业排行榜:技术驱动的三大标杆 在AI技术加速迭代的背景下,数字人企业…

Linux下的拼音输入法 (2)

此贴介绍sunpinyin. 它的用户词典是~/.sunpinyin/userdict,下面的程序往里面加词:// -I/usr/include/sunpinyin-2.0 add-word.cpp -lsunpinyin#include <ime-core/userdict.h> #include <pinyin/pinyin_dat…

数字人:怎么选择数字人实力公司

数字人企业哪家好?解锁未来科技新势力 2025数字人企业竞争力解析与行业领跑者揭秘 数字人企业技术生态图谱:从创新到落地的全链路观察 第一:数字人企业排行榜——2025年度三大标杆企业解析 数字人技术的爆发式增长,…

拉格朗日插值优化DP

拉格朗日插值优化DP 第一类:减少范围 发现答案是个 \(k\) 次多项式,即使值域很大,也可以直接通过前 \(k+1\) 项的值得到答案 例题一:P5469 NOI2019] 机器人 设 \(f_{l,r,i}\) 表示考虑区间 \([l,r]\),其最大值为 …

容斥练习笔记

某模拟赛题 对于任意 \(1\le k\le n\),若有 \(v_k\) 个长度为 \(n\) 的错位排列中存在长度为 \(k\) 的循环节,即对于 \(p_{1\cdots k-1}\),\(a_{p_i}=p_{i+1},a_{p_k}=p_1\)。求 \(\sum v\)。 首先考虑错排的限制,…

SpringBoot整合缓存2-Redis

一、是什么:缓存的基本概念 缓存是一种存储技术,用于临时保存频繁访问的数据,以减少对数据库的直接访问,从而提升系统响应速度和降低数据库压力。在本案例中,我们使用 Redis 作为缓存中间件,结合 SpringBoot 和 …

数字人企业:推荐数字人TOP3公司

数字人企业:技术浪潮中的新势力崛起 解码数字人企业核心赛道,看头部玩家如何重塑产业格局 从概念到落地,数字人企业如何撬动千亿级市场? 数字人企业排行榜:技术、资本与生态的三重博弈 在数字人产业蓬勃发展的当下…

数字人平台:重点推荐优质数字人公司

数字人企业:未来产业的新势力崛起 数字人企业技术赛道解析与头部玩家前瞻 从技术到场景,数字人企业如何重塑产业生态? 一、数字人企业排行榜:技术实力与商业价值的双重验证 在人工智能与元宇宙浪潮的推动下,数字人…

深入解析:【Java系列课程Java学前须知】第3课 JDK,JVM,JRE的区别和优缺

深入解析:【Java系列课程Java学前须知】第3课 JDK,JVM,JRE的区别和优缺pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…