ESP32S3串口UART0,UART1UART2,软件模拟串口,USB虚拟串口的使用 - 基于ArduinoIDE

news/2025/4/1 23:11:43/文章来源:https://www.cnblogs.com/Luad/p/18797058

硬件串口的使用

硬件资源

我使用的具体的模组型号为 ESP32-S3-WROOM-1(U), 根据官方手册其有3个串口。

  • UART0:通常用于下载和输出调试信息串口,信号管脚默认与 GPIO43(TX) ~ GPIO44(RX) 复用,可以通过 GPIO 交换矩阵连接到任意 GPIO.
  • UART1:信号管脚默认与 GPIO17(TX) ~ GPIO18(RX) 复用,可以通过 GPIO 交换矩阵连接到任意 GPIO.
  • UART2:可以为任意 GPIO,通过 GPIO 交换矩阵配置。

UART0 的使用

UART0 是默认串口,使用方法是与 Arduino 官方 Board 兼容的。

1、参考文章:Serial | Arduino Documentation

2、简单示例。作用是当串口接收到数据后,通过串口发送回接收到的数据。

void setup()
{Serial.begin(115200);
}void loop()
{if (Serial.available() > 0){String receivedData = Serial.readStringUntil('\n');Serial.printf("Received: %s \r\n", receivedData);}
}

UART1 和 UART2 的使用

UART1 和 UART2 同样是 ESP32 的硬件串口,可以参考 UART0 的方法使用。但存在的问题是这两个串口默认的引脚配置在 Arduino 和 ESP32 的数据手册中描述的不同,因此在使用这两个串口时通常需要手动指定引脚

1、参考文章:

  1. Arduino Nano ESP32 User Manual | Arduino Documentation
  2. Serial.begin() | Arduino Documentation
  3. arduino-esp32/cores/esp32/HardwareSerial.cpp

2、串口引脚的设置可以在串口初始化时指定。

Serial1.begin(9600, SERIAL_8N1, RX1PIN, TX1PIN);
Serial2.begin(9600, SERIAL_8N1, RX2PIN, TX2PIN);
  • Parm 1:波特率;
  • Parm 2:串口配置,默认为 SERIAL_8N1;
  • Parm 3:串口 RX 引脚;
  • Parm 4:串口 TX 引脚;

2、简单示例。作用是当串口接收到数据后,通过串口发送回接收到的数据。

// 示例代码使用 UART1,UART2 使用方法与 UART1 完全一致所以不再赘述。#define RX1PIN 17
#define TX1PIN 18void setup()
{Serial1.begin(115200, SERIAL_8N1, RX1PIN, TX1PIN);
}void loop()
{if (Serial1.available() > 0){String receivedData = Serial1.readStringUntil('\n');Serial1.printf("Received: %s \r\n", receivedData);}
}

软件模拟串口的使用

如果硬件串口不够的话也可以使用软件模拟串口,有一个现成的第三方库可用 —— EspSoftwareSerial, 关于改库的使用方法一定程度上也可以参考 Arduino 官方的 SoftwareSerial Library

1、参考文章:

  1. plerup/espsoftwareserial: Implementation of the Arduino software serial for ESP8266
  2. SoftwareSerial Library | Arduino Documentation
  3. Software Serial for ESP8266 | Circuits4you.com

2、安装并导入库。

  1. 在 Arduino IDE 的库管理中搜索 EspSoftwareSerial 并安装;
  2. 接在项目代码中 #include <SoftwareSerial.h>,或者依次点击 Arduino IDE 菜单栏中的 项目 > 导入库 > 点击 EspSoftwareSerial 导入库。

3、简单示例,实现软串口与硬件串口 (Serial) 之间的双向数据转发。

#include <SoftwareSerial.h>#define MYPORT_RX 15
#define MYPORT_TX 16EspSoftwareSerial::UART myPort;void setup()
{pinMode(MYPORT_RX, INPUT);pinMode(MYPORT_TX, OUTPUT);Serial.begin(115200);// 初始化软件串口,baud,config,rxPin,txPin,invertmyPort.begin(19200, SWSERIAL_8N1, MYPORT_RX, MYPORT_TX, false);
}void loop()
{// 如果软件串口有数据可读,则转发到硬件串口if (myPort.available() > 0){Serial.write(myPort.read());}// 如果硬件串口有数据可读,则转发到软件串口if (Serial.available() > 0){myPort.write(Serial.read());}
}

4、🟡 使用软串口的注意事项:

  1. 软串口的波特率不宜过高,否则错误率会很高,官方例程中常用的 192009600 就是不错的选择。
  2. 软串口是半双工的,所以无法实现前文中硬串口同时自发自收的效果。
  3. 软串口支持的 Functions 有限,比如硬串口中的 readBytesUntil() 在这里就不被支持。

USB虚拟串口的使用

是的,一般情况下开发板上都会有一个 USB 转串口芯片来连接 ESP32 的硬件串口,但如果引脚资源特别吃紧的话,也是可以直接用 ESP32 的 USB 外设来虚拟串口的,同样也支持程序烧录,Arduino 官方推出的开发板 Arduino Nano ESP32 就是这么干的。

ESP32S3 的 USB 支持两种模式,分别是 USB-Serial-JTAGUSB-OTG, 这两种模式都支持作为虚拟串口使用,具体情况可参考官方手册。

USB-Serial-JTAG 模式

这种模式使用简单,功能固定。此模式的功能完全由硬件实现,也只能执行串口和 JTAG 调试功能

1、参考文章:

  1. Arduino Nano ESP32 User Manual | Arduino Documentation
  2. ESP32S3的三种下载方式UART0、Hardware CDC、USB-OTG CDC(TinyUSB)的设置和区别_esp32s3下载模式-CSDN博客
  3. 请问USB虚拟串口传输速率最高能到多少呢? - 恩智浦技术社区

2、开发板配置中将:

  • USB CDC On Boot 配置为 Enable.
  • USB Mode 配置为 Hardware CDC and JTAG.

3、🟡 USB 虚拟串口的注意事项。

  1. USB-Serial-JTAG 模式下的虚拟串口的名字顶替掉了原硬件串口 UART0 的 Serial, 在这种模式下使用 UART0 应使用 Serial0.
  2. USB 虚拟串口没有的概念,在串口调试助手中波特率任意设置都是可以通信的。

4、简单示例,实现 USB-Serial 与硬件串口 UART0 之间的双向数据转发。

void setup()
{Serial.begin(115200);Serial0.begin(115200);
}void loop()
{// 如果USB虚拟串口有数据,则转发到硬件串口UART0if (Serial.available() > 0){Serial0.write(Serial.read());}// 如果硬件串口UART0有数据,则转发到USB虚拟串口if (Serial0.available() > 0){Serial.write(Serial0.read());}
}

5、🟡 关于使用 USB 虚拟串口进行程序烧录,我遇到的问题是可以成功烧录并运行,但是到最后总会报一个错误出来,判断原因是烧录成功重启后与烧录工具的通信有问题,不过无伤大雅我就没细究了。

USB-OTG 模式

配置一

USB Mode USB CDC On Boot
USB-OTG (TinyUSB) Enable

此时虚拟串口的使用方式与 USB-Serial-JTAG 模式时完全一致,但其他地方略有差异:

  1. 无法使用该虚拟串口下载程序,可能是因为 USB-OTG 模式下 esptool 无法通过 USB 控制协议自动将设备切换到下载模式。
  2. 无法使用内置 JTAG 进行调试(这是自然)。

配置二

USB Mode USB CDC On Boot
USB-OTG (TinyUSB) Disable

诚然,关闭 USB CDC On Boot 后也可以自己用代码实现一个虚拟串口。

1、参考文章:

  1. Arduino ESP32 USB CDC功能使用介绍_usb cdc on boot-CSDN博客

2、简单示例,实现 USB-Serial 与硬件串口 UART0 之间的双向数据转发。

#include "USB.h"USBCDC USBSerial;void setup()
{Serial.begin(115200);USBSerial.begin(115200);USB.begin();
}void loop()
{// 如果USB虚拟串口有数据,则转发到硬件串口UART0if (USBSerial.available() > 0){Serial.write(USBSerial.read());}// 如果硬件串口UART0有数据,则转发到USB虚拟串口if (Serial.available() > 0){USBSerial.write(Serial.read());}
}

注意/备注

1、USB 虚拟串口能否正常使用与 USB ModeUSB CDC On Boot 两项配置息息相关,配置不正确的话即使编译通过实际后果也不堪设想。实际代码中建议判断 ARDUINO_USB_MODEARDUINO_USB_CDC_ON_BOOT 这两个宏的状态来决定程序的设计。


总结

使用 Arduino IDE 开发 ESP32 的感受

这是第一次用 Arduino 开发 ESP32, 虽说 Arduino 也是乐鑫官方推荐的开发工具,但实际用起来还是有很多坑的。

比如硬件串口引脚分配的问题,UART1 在 ESP32S3 模组的规格书和其他资料上都说了默认是 GPIO17(TX) 和 GPIO18(RX), 但不知道为什么到了 Arduino 上就变成了 GPIO16(TX) 和 GPIO15(RX), 明明这 Arduino 的支持也是乐鑫自己写的。

还有就是串口引脚的重定向问题,Arduino 官方关于 Serial 的 begin() 这个函数的参数只有两个 (speed, config), 是没有 .begin(115200, SERIAL_8N1, RX1PIN, TX1PIN) 这种用法的。出现这种用法的比较权威的地方就是乐鑫的 Arduino 支持包代码和 Arduino Nano ESP32 的用户手册中。

所以使用 Arduino IDE 开发 ESP32 时除了要看 Arduino 官方的资料一定还要看乐鑫的支持包的资料

因为当在 Arduino IDE 选择的开发板是使用对应支持包下面的文件的,举个例子即使是 Arduino.h 这个文件其实际指向的也是对应开发板支持包中的如 ...packages/esp32/.../Arduino.h, 既然支持包是第三方提供的,那资料自然也不能只看 Arduino 官方的,虽说第三方一定会最大程度上兼容官方,但细微之处难免会有差别。

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

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

相关文章

从0搭建nacos单点、集群

主机IP 主机名10.0.0.91 elk9110.0.0.92 elk9210.0.0.93 elk93nacos单机部署使用内置数据库 1.下载解压nacos [root@elk91 ~]# wget https://github.com/alibaba/nacos/releases/download/2.5.1/nacos-server-2.5.1.tar.gz[root@elk91 ~]# tar xf nacos-server-2.5.1.tar.gz -C…

ESP32在ArduinoIDE中的配置

🟡 注意 使用 Arduino IDE 开发 ESP32 时除了要看 Arduino 官方的资料一定还要看乐鑫的支持包的资料。详见↗️ 安装ArduinoIDE 到 Arduino 官网 下载最新版的 Arduino IDE 并安装。 🟡 压缩包格式的下载选项意义不大,Arduino IDE 2 无法制作为便携版,参考:绿色(Portabl…

文献阅读《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》

参考博客: 论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》 - 别关注我了,私信我吧 - 博客园 (cnblogs.com) 摘要 为将CNN推广到高维图结构数据中,基于spectral graph theory(谱图理论),设计了一种通用的fast local…

1013 Div3 F题目加注释

https://codeforces.com/contest/2091/problem/F这题主题思路就是递推,从下往上递推,然后用差分和前缀合得到下一行可能性,详细看代码注释点击查看代码 #include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; const…

20244319 实验二《Python程序设计》实验报告

20244319 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2443 姓名: 梁悦 学号:20244319 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1.设计并完成一个完整的计算机应用程序,完成加、减、乘、除、log等运算,…

让 LLM 既能“看”又能“推理”!

DeepSeek-R1 会推理,GPT-4o 会看。能否让 1 LLM既能看又能推理? DeepSeek-R1取得很大成功,但它有个问题——无法处理图像输入。 1.1 DeepSeek模型发展 自2024.12,DeepSeek已发布:DeepSeek-V3(2024.12):视觉语言模型(VLM),支持图像和文本输入,类似 GPT-4o DeepSeek-…

WindowsPE文件格式入门03.节表

https://www.bpsend.net/thread-306-1-1.html dump 我们点击运行程序进程加载时时,是把文件里面的数据映射进内存,这样进程里面的内存就拿到了各种各样的代码,数据等资源,但是如果我们反着来,就可以从进程的内存里把 exe 文件提出来,这个过程叫做dump过程 dump过程在对抗里面经…

7-二次、加解密、DNS等注入

加解密注入其实就是数据被加密了,注入的时候要先把注入语句进行相应加密再注入,只是叠加了一次加密而已二次注入二次注入一般用于白盒测试,黑盒测试就算是找到注入也没办法攻击 二次注入无法通过工具或手工发现,只能观察源代码才能发现 一般产生在有数据互联的情况,比如有…

8-WAF绕过

WAF WAF部署安全狗,宝塔等waf搭建部署 https://blog.csdn.net/nzjdsds/article/details/93740686 流量防护:某ip访问过多入黑名单 建议阿里云搞个服务器部署进行绕过测试WAF常见功能总体来说,WAF(Web Application Firewall)的具有以下四个方面的功能:审计设备:用来截获所有…

一个基于 .NET 开源免费的异地组网和内网穿透工具

前言 今天大姚给大家分享一个基于 .NET 开源免费的异地组网和内网穿透工具:linker。 工具介绍 linker是一个基于 .NET8 开源免费(GPL-2.0 license)的异地组网和内网穿透工具,支持TCP(支持IPV6)打洞、UDP打洞,服务器中继,异地组网使用虚拟网卡将各个客户端组建为局域网络、…

还是继续写博客吧!作为留痕、作为给面试官了解我的资料。

今天我被约谈了,没错,说的是“毕业”的事情 今天下午三点的时候,我接到了一个工单,我很纳闷,这是一个很简单且稳定运行了几年的东西,怎么有问题了?这个系统我太熟悉了,简单看下日志,便发现了问题所在——用户信息上的关键标识缺失,导致了某个接口查询无结果。我赶紧联…