ESP32 for arduino 的3个hardware serial

2023-05-16

在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接口,先定这些,之后如有必要再进一步深入探讨。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 for arduino 的3个hardware serial 的相关文章

  • 如何查询android设备硬件信息

    我如何获取 Android 设备硬件信息 如 CPU 架构 速度 霓虹灯 GPU 名称 制造商 RAM 大小 我希望有一种方法可以使用 ndk 本地执行此操作 但如果只能通过 java 代码实现 那么如何执行此操作 您需要使用Build h
  • Arduino Python3 脚本

    我正在尝试使用 Python3 脚本来控制 Arduino Mega 这是一个简单的脚本 用于从键盘获取一行并通过 Arduino 回显它 我从一个可用的 Python 2 脚本开始http petrimaki wordpress com
  • 如何使用arduino从sim900模块的RTC读取日期和时间数据?

    include SIM900 h include
  • ARDUINO 常数有什么用?以前是22,现在是100

    我正在使用热电偶并下载了 MAX6675 库 我想知道以下几行中 ARDUINO 常量的值是做什么用的 if ARDUINO gt 100 lcd write byte 0 else lcd print 0 BYTE endif lcd p
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • 经典蓝牙 (2.1) 设备可实现的最小数据包延迟是多少?

    我正在使用 RN42 http www microchip com wwwproducts en RN42 http www microchip com wwwproducts en RN42 蓝牙模块以 115200 波特率 UART S
  • Python自动选择串口(适用于Arduino)

    目前 Python 程序必须知道设备 Arduino 位于哪个端口 然后 Python 才能与设备进行通信 Problem 每当设备拔出并重新插入时 其 COM 端口都会发生变化 因此必须再次向 Python 提供正确的串行端口 以便它找到
  • sim800L GPRS 发布请求

    我一直在研究 LoNet 迷你 GSM 模块 SIM800L 并将其与 Arduino 连接 我已插入 SIM 移动卡并且可以连接互联网 通过串行监视器 我可以毫无问题地与它通信 但是当向网络服务器页面发出 GET 或 POST 请求时 它
  • 同时使用 GPRS 和 GSM

    我正在尝试使用 GSM GPRS 调制解调器的 GPRS 功能将数据发送到远程服务器 但我无法这样做 我在 Arduino 论坛上发布了一个问题 但没有得到任何回复 这是问题的链接 https robotics stackexchange
  • ESP32 上的 Web 服务器:如何自动更新和显示来自服务器的传感器值?

    我在 ESP32 上有一个网络服务器 在该服务器上有一个主页 我想每隔 x 秒自动更新主页上的传感器值 无需用户输入 我无法访问文件系统 该传感器直接连接到 ESP32 传感器值位于我的 C 程序中 存储在变量中并定期更新 变量是全局的 以
  • 在windows和linux上用Python获取唯一的计算机ID

    我想在 Windows 和 Linux 上使用 Python 获得一个唯一的计算机 ID 它可以是 CPU ID 主板序列号 或其他任何内容 我查看了几个模块 pycpuid psi 但没有运气 关于如何做到这一点有什么想法吗 似乎没有直接
  • C++:将成员函数作为普通函数指针传递的闭包

    我正在尝试调用外部库的成员函数 该函数接受函数指针作为参数 Timer every unsigned long period void callback void 但不幸的是我想传递的参数是一个成员函数 void MyClass the m
  • 终止导致设备或资源繁忙的进程:“/dev/ttyUSB0”?

    我使用以下 Python 代码连接到我的 Arduino 板 device glob glob dev ttyUSB 0 time sleep 1 arduino serial Serial device 115200 timeout 5
  • 我可以使用哪些工具来确定应用程序的硬件要求?

    For regular readers The saga continues 我的应用程序在我的开发机器上运行良好 该机器是作为相当好的游戏装备购买的 5 年前 因此 它是 64 位 2 2GHz 时钟速度和 2GB 内存 然而 工作中的机
  • Arduino 上的 Serial 和 Stream 有什么区别,Serial.write 是如何实现的?

    我很难理解串行和流这两个术语之间的区别 串行不是流的一种吗 我对作业有一些我不明白的问题 计算机通过使用 流或串行 读取 彼此发送的数据来确定每个字节的含义 Also Serial write 我也很困惑 它返回一个字节的数据 对吗 一个字
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • SIM900 GSM/GPRS 未获得正确的 AT+CREG?回答

    我使用的是带有 IComsat SIM900 GSM GPRS 扩展板的 Arduino UNO 使用以下教程 Arduino 实时 GPS 追踪器 http www samaria me uk 2011 12 arduino live g
  • 通过iPhone音频插孔读取数据

    我正在寻找一种方法来读取通过 iPhone 的音频插孔从 Arduino 发送的原始数据 我搜索了很多并发现this https github com sanjibahmad Is Headphone Plugged In tree mas
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • RS 232 中断信号

    我有一个RS232信号捕获设备 而且效果很好 我需要一些帮助来理解数据 基本上我们购买它是因为我们正在处理 80 年代末使用串行通信的机器控制器 尽管知道端口参数 但我们运气不佳 从我转储的数据来看 机器控制正在使用中断信号作为其协议的一部

随机推荐

  • MiniFly Firmware V1.1开源四轴代码分析六:stabilizer.c

    在stabilizer c定义四个结构体 span class token comment 以下变量都是布尔变量 span span class token keyword static span span class token keyw
  • NRF24L01+模块:一对一双向通信,成功!

    查找了很多资料 xff0c 好多都是复制粘贴转发 xff0c 或者安装英文手册直译的 xff08 比如我自己上篇笔记 xff0c xff0c xff09 xff0c 看完还是一脸懵逼 xff0c 没几个可行的 xff0c 推荐几个比较实在的
  • NRF24L01几个函数的分析

    首先看两个版本关于NRF的宏定义 xff1a 开发板 xff1a 遥控器 xff1a 1 xff0c 最基本的读写函数 xff0c 函数的返回值就是读来的数据 xff0c 形参就是写入的数据 stm32mini开发板例程中 xff1a sp
  • stm32f103之HC_SR04超声波测距

    参考资料 xff1a stm32与HC SR04超声波传感器测距 HC SR04超声波测距注意事项 STM32 驱动HC SR04超声波测距模块 HC SR04初识 HC SR04 超声波原理图讲解与时序分析与arduino使用 HC SR
  • stm32之蓝牙模块HC-05使用

    参考资料 xff1a 常用模块 HC 05蓝牙串口通信模块使用详解 xff08 实例 xff1a 手机蓝牙控制STM32单片机 xff09 HC 05蓝牙模块使用教程 HC 05蓝牙模块使用记录 补充与理解 xff1a 套餐有两个板子 一个
  • MPU9250的MPL移植_HAL库(以STM32F103为主控)

    准备材料 xff1a 驱动库 xff1a motion driver 6 12 硬件 xff1a 正点原子MINI STM32f103RCT6硬件IIC PB8 PB9 GY 91模块 看图可知AD0接地 xff0c 地址是0X68 硬件连
  • MPU9250简单快速更改MPL驱动,方便使用MPL和DMP

    附件准备材料 xff1a 我自己的资料MPU9250 c和MPU9250 h 1 xff0c 使用stm32cubemx配置好IIC 2 xff0c 在c c 43 43 处加入宏定义MPU9250 EMPL 最后为 xff1a USE H
  • 重定向printf,不使用微库,采用ARM Compiler 6 报错如何解决?

    复制正点原子的以下代码 xff0c 不使用微库 xff0c 采用ARM Compiler 6 报错 xff1a 报错 xff1a pragma import is an ARM Compiler 5 extension and is not
  • uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

    uint8 t uint16 t uint32 t uint64 t 都是别名 xff0c c语言中有哪些数据类型 xff1f 怎么样取别名 在C语言中有6种基本数据类型 xff1a short int long float double
  • 使用stm32c8t6和mpu6050制作一台穿越机

    飞控部分 xff1a 介绍 xff1a 使用stm32c8t6和mpu6050制作一款低价飞控 xff0c 固件用的是开源的betaflight 3 2 5 NAZE xff0c 飞行噪声很小 xff0c 可能是桨叶好 xff0c 乾丰5寸
  • 小米平衡车plus放久后无法充电解决办法

    半年没在家 xff0c 电池没充电 xff0c 回来后发现已经无法充电 xff0c 看了网上一些 激活神器 的产品 xff0c 有人说是智商税 xff0c 我猜那个东西也没什么神奇的东西 xff0c 像这款plus的充电线上3孔的 xff0
  • c语言宏函数怎么传递宏参数_C语言中的宏参数评估

    c语言宏函数怎么传递宏参数 We can define a function like Macro in which we can pass the arguments When a Macro is called the Macro bo
  • MiniFly V1.1开源四轴驱动代码分析八:旋转矩阵、控制分配矩阵等分析介绍

    很久没更新 看见订阅数量持续增加 感觉得加点料才对得起大家的 旋转矩阵 前言 在网上搜索到的一下关于旋转矩阵的表达形式 看起来很像 都是三角函数组合成 不同资料的正负号或者字母不一样 甚至一些是有模有样的复制粘贴 看的脑壳疼 旋转矩阵的形式
  • 数据区、栈区、堆区、代码区

    简介 1 栈区 stack xff1a 由系统的编译器自动的释放 xff0c 主要用来存放方法中的参数 xff0c 一些临时的局部变量等 xff0c 并且方法中的参数一般在操作完后 xff0c 会由编译器自动的释放掉 2 堆区 heap 由
  • 上位机PC控制UR3机器人实现方式

    一 在计算机上安装urx 库 终端输入 xff1a pip install urx xff1b 参考和例程下载见 xff1a https github com SintefManufacturing python urx xff1b 二 利
  • STM32实战项目-串口打印

    前言 xff1a 本小结主要实现串口打印功能 xff0c 主要将上一结的状态机运行次数 xff0c 通过串口在串口终端上打印出来 xff0c 硬件电路上主要是TTL转USB驱动电路 xff0c 软件上主要有状态机函数 xff0c 串口发送函
  • CURL详解

    原文链接 xff1a https www cnblogs com xishaonian p 6550613 html span class token number 1 span CURL详解 span class token number
  • STM32F103C8T6串口通信

    STMF103C8T6串口通信 串口相关的固件函数 xff1a mainusart cusart h 串口作为 MCU 的重要外部接口 xff0c 同时也是软件开发重要的调试手段 xff0c 其重要性不言而喻 关于STM32F103C8T6
  • 单片机(中断系统-串口通信)

    1 RETI 中断操作指令 这条指令的功能和RET指令相似 xff0c 2条指令的不同之处是 xff1a 本指令清除了中断响应时 xff0c 被置1的MCS 51内部不可寻址的 优先级生效 触发器清零 中断程序完成后 xff0c 一定要执行
  • ESP32 for arduino 的3个hardware serial

    在arduino IDE的开发环境中 xff0c 如果使用的开发板不是arduino的开发平台 xff0c 而是ESP32模组的开发板 xff0c 那么在实际开发中由于ESP32的支持库与arduino不同 xff0c 会使得我们在使用一些