跳到主要内容

第 02 节 调试 RS485 接口

在 ESP32-S3 芯片中有三个 UART 的控制器,可以支持半双工的 RS485 协议,使用差分信号传输数据,相比于 RS232 具有更远的传输距离及更高的传输速率。为了实现单端信号与差分信号的转换,还需要连接一个外部 RS485 收发器,用于 RS485 信号的驱动和接收。

在本产品当中,我们将 ESP32-S3 的 IO15 和 IO16 分别作为 RS485 的 TX 引脚和 RX 引脚,连接到了 SP3485EN 收发器,并引出了一个 PH2.0 2PIN 的座子,可供客户连接到各种 RS485 的设备进行通信和控制。

下面是个简单的连接示意,具体的硬件连接图请参考我们的 原理图 哦~

ESP32-S3-Touch-LCD-7 RS485 demo 2
ESP32-S3-Touch-LCD-7 RS485 demo 1

在本节的教程当中,我们将使用这个端口与电脑进行通信,提供了一个简单的 RS485 发送回传的例程,让初学小白也能迅速了解如何使用驱动 RS485 接口进行通信。

元件清单

本次例程需要用到的元件有:

  • ESP32-S3-Touch-LCD-7 x1
  • USB TO RS485 (B) 模块 x1
  • USB 线 type A 公口 转 Type C 公口 x1
  • HY2.0 2PIN 转杜邦公头线 x1
  • 扁头螺丝刀 x1
ESP32-S3-Touch-LCD-7 RS485 demo 10

硬件连接

  1. 先将配套的 2PIN 排线公头连接器接到 RS485 的白色接口上,确保线材与接口接触良好

  2. 将 ESP32-S3-Touch-LCD-7 的 RS485 A 端接入到 USB TO RS485 (B) 模块的 A+端,同样,B 端接到 B-端。使用扁头螺丝刀调整 USB TO RS485 模块上接口的螺丝,将黑红两根线的排针卡住,确保连接牢固稳定。

    ESP32-S3-Touch-LCD-7 RS485 demo 8
  3. 再将 USB TO RS485 (B) 的 USB 口插到电脑的 USB 口

  4. 用 Type A 公口 转 Type C 的 USB 线将 ESP32 的 USB 也接到电脑的 USB,用于下载程序和查看串口调试信息。 完成全部连接如下图:

    ESP32-S3-Touch-LCD-7 RS485 demo 7
    硬件分析

    PIN15 作为 RS485 接收引脚,PIN16 作为 RS485 发送引脚,连接到 RS485 的收发器(transceiver)芯片,转接成 RS485 接口信号形式;RS485 接口再连接到 USB TO RS485 (B) 模块转换成 USB 信号,再连接到电脑进行通信。

示例代码

请先从以下地址下载例程包:ESP32-S3-Touch-LCD-7 示例程序 (如果先前已经下载,直接打开对应文件夹即可) 将例程压缩包解压之后,打开对应的 \Arduino\examples\02_RS485_Test 文件夹。

ESP32-S3-Touch-LCD-7 RS485 demo 3

双击打开 02_RS485_Test.ino

ESP32-S3-Touch-LCD-7 RS485 demo 4

前面我们已经连接好了下载程序的 USB 口,在打开程序后,右上角选择好串口和开发板型号 Waveshare ESP32-S3-Touch-LCD-7:

ESP32-S3-Touch-LCD-7 RS485 demo 5

提示

此时由于连接了两个 USB,电脑端会多识别出一个 COM 口,这个是 USB TO RS485 (B) 模块的 COM 口,我们上传程序时注意选择先前识别过的 ESP32-S3 的 COM 口。(当然选错到 USB TO RS485 (B) 模块的 COM 口也没关系,程序会下载失败,这时再设置用另一个 COM 口下载就能成功)

然后点击箭头按钮进行程序上传,等待上传完成即可。

ESP32-S3-Touch-LCD-7 RS485 demo 6

运行结果

程序上传完成后,进行 RS485 调试,这时我们需要用到 SSCOM 类型的串口调试工具,下载安装后打开串口调试工具,按照下面步骤进行设置。

向 ESP32-S3 的 RS485 串口发送 waveshare,程序读到之后立马会向电脑端返回相同的字符,从而实现了一个简单的 RS485 收发过程。

ESP32-S3-Touch-LCD-7 RS485 demo 9

提示

图上第 1 步选择 COM 口时注意选择带 USB-Enhanced-SERIAL CH343 的 COM 口,这个才是 USB TO RS485 (B) 模块对应的串口,电脑主要是跟这个接口进行通信的,

代码回顾

    // Define 485 communication pins
#define RS485_RX_PIN 15
#define RS485_TX_PIN 16

// Redefine serial port name
#define RS485 Serial1

void setup() {
// Initialize 485 device
RS485.begin(115200, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN);
while (!RS485) {
delay(10); // Wait for initialization to succeed
}
}

void loop() {
// Waiting for 485 data, cannot exceed 120 characters
if (RS485.available()) {
// Send the received data back
RS485.write(RS485.read());
}
}

  1. 首先用 #define 分别定义了 RS485 接收引脚和发送引脚分别为 15 和 16,并重新定义 Serial1 的名字为 RS485。
  2. void setup() 函数当中,用 RS485.begin (即 Serial1.begin)初始化了 Serial1 的串口波特率为 115200,数据格式为 SERIAL_8N1 8 位,接收引脚和发送引脚分别为 15 和 16;然后通过 while() 循环检查确保串口初始化成功。
  3. void loop() 函数当中,通过 if 函数检查串口是否有数据可用,若有数据则读取一个字节并立即发送回去,实现将接收到的 485 数据原封不动地回传的功能。