ESP32 for arduino 的3个hardware serial

本文详细介绍了在ArduinoIDE中使用ESP32开发板时,如何应对ESP32的硬件串行通信接口。ESP32提供三个串口(Serial, Serial1, Serial2),但Serial常用于USB通讯,Serial1受限于SPIFlash,实际可用的是Serial2。通过HardwareSerial库,开发者可以自定义串口,例如创建名为MySerial的串行通信对象,并指定GPIO口。注意避免使用被SPIFlash占用的GPIO口,并避免将TX定义在GPIO36、39、34、35上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在arduino IDE的开发环境中,如果使用的开发板不是arduino的开发平台,而是ESP32模组的开发板,那么在实际开发中由于ESP32的支持库与arduino不同,会使得我们在使用一些类,对象,函数等系统资源时会与arduino 标准的用法有很多区别。对于没有arduino硬件平台使用经验的人则不用于关注这个区别,直接按ESP32的规则去使用就行了。对于原来有arduino硬件平台上开发经历的人而言,则要注意这此区别。下面就ESP32平台中Serial这个串行通信对象的进行说明:

概述

ESP32的基于硬件的串行通信接口总共有三个。分别定义在了如下的GPIO口:

名称IO口的对应关系系统默认的对象名
UART0GPIO1 - TX0 GPIO3 - RX0Serial
UART1GPIO10 - TX1 GPIO9 - RX1Serial1
UART2GPIO17 - TX2 GPIO16 - RX2Serial2

针对三个硬件串行通信接口,ESP32已预先对应的建立了三个对象Serial、Serial1、Serial2。因此我们才可以在开发时直接上来就写Serial.begin(9600) ; Serial.print(“Hello World!”);这样使用串口。

HardwareSerial库

三个串行通讯对象实际,都在HardwareSerial.h库中进行了定义。
该库具体路径:

C:\Users\loneve\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\cores\esp32\HardwareSerial.cpp

(每个人的安装路径在C:\Users\loneve部分可能不一样,请注意区分)。

【Heardware.h中的定义】

#ifndef HardwareSerial_h
#define HardwareSerial_h

#include <inttypes.h>

#include "Stream.h"
#include "esp32-hal.h"

class HardwareSerial: public Stream
{
public:
    HardwareSerial(int uart_nr);

void begin (
unsigned long baud, 
uint32_t config=SERIAL_8N1, 
int8_t rxPin=-1, 
int8_t txPin=-1, 
bool invert=false, 
unsigned long timeout_ms = 20000UL
);
...................................

protected:
    int _uart_nr;
    uart_t* _uart;
    uint8_t _tx_pin;
    uint8_t _rx_pin;
};

///

【Heardware.h中的定义】

...............
#include "pins_arduino.h"
#include "HardwareSerial.h"
#define RX1 9

#define TX1 10

#define RX2 16

#define TX2 17

#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
HardwareSerial Serial(0);
HardwareSerial Serial1(1);
HardwareSerial Serial2(2);
#endif

HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _uart(NULL) {}

void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms)
{
    if(0 > _uart_nr || _uart_nr > 2) {
        log_e("Serial number is invalid, please use 0, 1 or 2");
        return;
    }
    if(_uart) {
        end();
    }
    if(_uart_nr == 0 && rxPin < 0 && txPin < 0) {
        rxPin = 3;
        txPin = 1;
    }
    if(_uart_nr == 1 && rxPin < 0 && txPin < 0) {
        rxPin = RX1;
        txPin = TX1;
    }
    if(_uart_nr == 2 && rxPin < 0 && txPin < 0) {
        rxPin = RX2;
        txPin = TX2;
    }

   .....................
    }
}

这本来是一件方便开发者使用的设置,但是我们在实际开发时会发现,Serial对象一般已被开发板定义用来进行USB通讯,以及用来给开发板烧录编译好的程序。而Serial1由于占用了GPIO9和GPIO10,而这两个IO口已被开发板用在了SPI Flash上。因此实际Serial1我们也是用不上的。只有Serial2可以用。
幸运的是,ESP32有个可以把硬件串口映射到其它任意端口的能力。

映射到其它端口

因此我们可以这样用:

HardwareSerial MySerial(1);

void setup() {
MySerial.begin(9600, SERIAL_8N1, 16, 17);
}

还是根据库文件源代码

HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _uart(NULL) {}

void begin  (
unsigned long baud, 
uint32_t config=SERIAL_8N1, 
int8_t rxPin=-1,  
int8_t txPin=-1, 
bool invert=false, 
unsigned long timeout_ms = 20000UL );

我们可以知道这两个函数所带参数的定义:
构造函数HardwareSerial(int uart_nr)只有一个参数。设定是串行通行口几,因此上例中HardwareSerial MySerial(1);是建立了一个指向了硬件UART1的串行通讯对象MySerial。由于自已为这个对象起了名字。因此在启动该端口时必须至少指定(波特率、串行帧格式、rx对应的GPIO序号、TX对应的GPIO序号)。
另两个invert 和timeout_ms两个参数取默认值就好,不用设定。那接下来,就可以愉快的使用自已定义的串行通讯对象了。
下面把两种不同的使用方式放在一起对比,便于理解:

使用系统默认的串口:

Serial.begin(9600);
Serial.print(“Hello World!);

使用自定义串口:

HardwareSerial MySerial(1);

void setup() {
MySerial.begin(9600, SERIAL_8N1, 16, 17);
}
void loop{
    uint8_t inputByte =MySerial.read();
}

这里有两点需要注意:

1、GPIO6,7,8,9,10,11已被用于SPI Flash,所以在定义串口TX和RX时请避开这些引脚。
2、由于ESP32开发板的GPIO36、39、34、35是纯输入口,因此最好不要把串口通讯IO口的TX定义在上面这四个口。RX则可以随便定义。

关于Serial接口,先定这些,之后如有必要再进一步深入探讨。

ESP32 S3 Arduino 开发教程通常会涉及使用第三方库和物联网服务将传感器数据上传到云平台的过程。以下是基本步骤: 1. **设置环境**: - 安装Arduino IDE for ESP32,并更新到支持ESP32 S3的版本。 - 安装Espressif IoT SDK 或 Arduino IoT Cloud插件,以便连接到ESP32 S3并集成云服务。 2. **硬件准备**: - 配置ESP32 S3模块,包括电源、WiFi模块和必要的传感器。 3. **编写代码**: - 使用Arduino,创建一个新的项目,选择`Hardware > Espressif > ESP32S3` - 编写程序,读取传感器数据,如DHT或BME280,然后通过WiFi连接获取互联网。 4. **数据发送**: - 引入适当的库(例如AWS IOT SDK, ThingsBoard SDK等),创建一个函数来处理数据包的构建和发送。 - 示例代码可能会包含这样的片段: ```c++ void sendToCloud(String sensorData) { WiFiClient client; if (client.connect("your_cloud_server", port)) { String request = "POST /api/data HTTP/1.1\r\n"; // 添加数据头,如Content-Type和Authorization(如果需要) request += "Content-Type: application/json\r\n"; request += "Authorization: Bearer your_token\r\n\r\n"; request += "{\"sensor\":\"" + sensorData + "\"}\r\n"; client.print(request); Serial.println("Data sent to cloud."); } else { Serial.println("Connection failed."); } } ``` - 然后在循环中定时触发这个函数,将数据推送到指定的云端API。 5. **错误处理与调试**: - 要确保网络连接稳定,添加适当的错误检查和重试机制。 - 使用Serial打印功能监控程序运行状况。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑牛唱剧本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值