创客出手

目录

ESP32使用串口通信详细解释

关于串口

串口通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式,是最常见的一种通信方式之一,也是各种SoC主板的重要资源。往往主板上的硬串口数量,决定了主板的可扩展性的能力,毕竟很多的传感器都使用串口接口进行数据交换,硬串口数量约制了可连接串口传感器的数量。本文将列举不同ESP32主板的串口定义细节,供大家参考。

关于UART

UART是Universal Asynchronous Receiver/Transmitter的简称,通用异步接收器/发送器是一种硬件功能,可使用广泛采用的异步串行通信接口(如 RS232、RS422 和 RS485)处理通信(即时序要求和数据帧)。 UART 提供了一种广泛采用且廉价的方法来实现不同设备之间的全双工或半双工数据交换。

ESP32 芯片有 3 个 UART 控制器(也称为端口),每个控制器都具有一组相同的寄存器以简化编程并提供更大的灵活性。

串口通信过程

串行通信由每个 UART 控制器的有限状态机 (FSM) 控制,发送信息的步骤如下:

  1. 将数据写入发送端 FIFO 缓冲区
  2. FSM序列化数据
  3. FSM将数据发送出去

接收信息的步骤如下:

  1. FSM 处理传入的串行流并将其并行化
  2. FSM 将数据写入 Rx FIFO 缓冲区
  3. 从 Rx FIFO 缓冲区读取数据

因此,应用程序只会分别使用 uart_write_bytes() 和 uart_read_bytes() 从特定缓冲区写入和读取数据,其余的由 FSM 完成。而ESP32把这个有限状态机FSM的流控制做到了芯片内部,也就是flow control,另外缓冲区也专门分配了DMA (Direct Memory Access)用于串口数据处理,因此使用硬串口,数据处理效率会快很多,并且更少地占用cpu资源。

ESP32, ESP32-S, ESP32-S2, ESP32-S3, ESP32-SC3芯片的串口数量

ESP32文档声称芯片配备了3个串口控制器,每隔GPIO都能变成串口,因此从引脚图上你可以看到Serial,Serial1(不常用),Serial2的引脚定义,但实际上影响性能的关键是是否配备相应的Flow control硬件和DMA硬件,而这些硬件并不是都具备的。

总结几款常用的SoC芯片,配备两个独立Flow Control和DMA的芯片有

  • ESP32-S (安可信NodeMCU版本)
  • ESP32-S2
  • ESP32-C3

配备三个独立Flow Control和DMA的芯片有

  • ESP32 (ESP32-D0WD-V3, ESP32-D0WDR2-V3)
  • ESP32-S3

使用ESP32的3个硬串口

ESP32在Arduino框架里定义的串口分别为Serial,Serial1,Serial2。三个串口对应的引脚分别如下:

串口 RX引脚 TX引脚 备注
Serial GPIO3 GPIO1 一般情况下可直接使用
Serial1 GPIO9 GPIO10 默认配置情况下 GPIO 6-12 是FLASH 的接口,不能被其他程序使用
Serial2 GPIO16 GPIO17 一般情况下可直接使用

ESP32串口

因为Serial1默认的GPIO口被Flash端口占用,一般不建议使用,如果要使用Serial1可以有两个办法,

  1. 使用DIO方式烧录代码,这种方式是牺牲了上传的速度,但烧录时不会使用GPIO 16,GPIO 17。
  2. 把Serial1映射到其他GPIO口,只要没有其他冲突,都能正常使用硬串口。

串口使用程序例子

// 如果要重新映射端口,可以修改下面的GPIO口的定义
//如果使用Serial1时,可以通过DIO方式上传代码
//#define RXD1 9
//#define TXD1 10
#define RXD2 16
#define TXD2 17

void setup() {
  Serial.begin(115200);
//  Serial1.begin(9600, SERIAL_8N1, RXD1, TXD1);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
}

void loop() { //当Serial1或Serial2收到数据时,通过Serial串口显示出来
  while (Serial2.available()) {
    Serial.print(char(Serial2.read()));
  }
}
更多关于 的文章
关注创客出手公众号

关注创客出手