Seeed Studio XIAO-RS485-Expansion-Board 入门指南

tip
- V1.1 及更早版本使用软件方向控制。请参阅软件到软件方向示例。
特性
- 兼容 Seeed Studio XIAO:专为 Seeed Studio XIAO 开发板设计。
- 长距离通信:支持最长 1,200 m(约 3,937 ft)的 RS-485 通信距离。
- 5V 或 12V 直流输入:支持任一供电电压,板载电路可将 12V 转换为 5V。
- 两个 3 针端子:分别用于 RS-485 信号(A、B、GND)和电源(INT、5V、12V)。
- 紧凑设计:尺寸大约为两个 XIAO 板大小,适用于空间受限的项目。
- 可选方向控制:可通过板载 0 Ω 电阻配置为硬件自动或软件控制的 RS-485 收发切换。出厂默认配置为硬件自动方向控制。
- RX/TX 活动指示灯:指示数据接收和发送状态。
- 5V 和 12V 电源指示灯:指示对应输入电压是否存在。
硬件概览
- XIAO RS485 扩展板
- XIAO RS485 扩展板指示图 V1.2 正面

- XIAO RS485 扩展板指示图 V1.2 背面

准备材料
连接示意图
- XIAO RS-485 扩展板 V1.2 使用 TP8485E-SR 收发器。RS-485 信号与 XIAO 引脚的对应关系如下:
RS485_TX接 D4,RS485_RX接 D5,RS485_DE接 D2。

| 两个 RS485 扩展板的连接 |
|---|
![]() |
- 5V OUT/IN 开关:控制 5V 端子电源的方向。当本板向其他设备提供 5V 时,将其设置为
OUT;当本板通过端子接收 5V 时,将其设置为IN。 - 120R 开关:设置为
ON时,将板载 120 Ω 终端电阻接在 RS-485 的 A 和 B 线上;设置为NC时断开该电阻。对于长距离布线,应在总线物理两端启用终端电阻;中间节点保持断开。 - INT:预留中断连接。
tip
- V1.2 默认配置为硬件自动方向控制,因此示例程序无需通过 D2 切换方向。若要使用软件方向控制,需要更改板载 0 Ω 电阻的位置。
- 硬件自动方向所用零欧电阻的位置

- 软件手动方向所用零欧电阻的位置

软件概览
在本项目中,XIAO ESP32C3 通过 D4(GPIO6)和 D5(GPIO7)与 RS485 扩展板通信。
硬件自动方向到硬件自动方向
当选择硬件自动方向控制时,示例程序无需控制 DE 引脚。
1. 发送端代码
#include <Arduino.h>
// Hardware -> Hardware: sender (XIAO ESP32C3, RS485 board V1.2).
// Fit R23/R24 for automatic direction; D2 is unused.
void setup() {
Serial.begin(115200); // USB serial monitor.
Serial1.begin(9600, SERIAL_8N1, D5, D4); // RS485: RX=D5, TX=D4.
Serial.println("Hardware -> Hardware sender ready");
delay(500);
}
void loop() {
Serial1.println("Hello from hardware sender"); // Send over the RS485 bus.
Serial.println("Sent: Hello from hardware sender"); // Show status via USB.
delay(1000);
}
Serial.begin(115200)启动用于串口监视器的 USB 串口输出。Serial1.begin(9600, SERIAL_8N1, D5, D4)以 9600 波特率启动 RS-485 通信。D5 为 RX,D4 为 TX。- 开发板自动控制传输方向,因此该示例程序不使用 D2。
Serial1.println()每秒发送一行文本。Serial.println()通过 USB 显示本地发送状态,它并不能确认接收端是否收到了消息。
2. 接收端代码
#include <Arduino.h>
// Hardware -> Hardware: receiver (XIAO ESP32C3, RS485 board V1.2).
// Fit R23/R24 for automatic direction; D2 is unused.
void setup() {
Serial.begin(115200); // USB serial monitor.
Serial1.begin(9600, SERIAL_8N1, D5, D4); // RS485: RX=D5, TX=D4.
Serial.println("Hardware -> Hardware receiver ready");
delay(500);
}
void loop() {
if (Serial1.available()) {
String message = Serial1.readStringUntil('\n'); // Read one RS485 line.
message.trim();
if (message.length() > 0) {
Serial.print("Received: "); // Display on the USB serial monitor.
Serial.println(message);
}
}
}
Serial通过 USB 显示消息。Serial1通过 D5 从 RS-485 收发器接收数据。Serial1.available()检查 UART 缓冲区中是否有等待处理的接收字节。Serial1.readStringUntil('\n')读取直到换行符或超时。message.trim()会移除首尾空白字符,包括由println()发送的回车符。- 如果最终得到的消息非空,则通过
Serial.print()和Serial.println()在 USB 串口监视器中显示。 - 开发板自动控制方向,因此该示例程序不使用 D2。
3. 测试结果
- 为每块 XIAO 打开 USB 串口监视器,以查看发送和接收的消息。

- 在数据传输过程中,板载 TX 和 RX 指示灯会闪烁以显示相应的活动状态。

硬件自动方向到软件方向
1. 发送端代码
#include <Arduino.h>
// Hardware -> Software: sender (XIAO ESP32C3, RS485 board V1.2).
// Fit R23/R24 for automatic direction; D2 is unused.
void setup() {
Serial.begin(115200); // USB serial monitor.
Serial1.begin(9600, SERIAL_8N1, D5, D4); // RS485: RX=D5, TX=D4.
Serial.println("Hardware -> Software sender ready");
}
void loop() {
Serial1.println("Hello from hardware sender"); // Send over the RS485 bus.
Serial.println("Sent: Hello from hardware sender"); // Show status via USB.
delay(1000);
}
Serial.begin(115200)启动 USB 串口输出。Serial1.begin(9600, SERIAL_8N1, D5, D4)启动 RS-485 UART,其中 D5 为 RX,D4 为 TX。- 此板使用硬件自动方向控制,因此发送端无需操作 D2。
- 在
loop()中,Serial1.println()每秒通过 RS-485 发送一行文本。 Serial.println()通过 USB 显示本地发送状态。检查接收端的串口监视器以确认是否收到数据。
2. 接收端代码
在软件方向控制模式下,将 D2 配置为输出,并在接收端保持为 LOW 以启用接收模式。
#include <Arduino.h>
// Hardware -> Software: receiver (XIAO ESP32C3, RS485 board V1.2).
// Fit R25/R26 for software direction; D2 stays LOW to receive.
void setup() {
Serial.begin(115200); // USB serial monitor.
Serial1.begin(9600, SERIAL_8N1, D5, D4); // RS485: RX=D5, TX=D4.
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW); // Keep RS485 in receive mode.
Serial.println("Hardware -> Software receiver ready");
}
void loop() {
if (Serial1.available()) {
String message = Serial1.readStringUntil('\n'); // Read one RS485 line.
message.trim();
if (message.length() > 0) {
Serial.print("Received: "); // Display on the USB serial monitor.
Serial.println(message);
}
}
}
Serial用于 USB 串口监视器,而Serial1通过 D5 接收 RS-485 数据。pinMode(D2, OUTPUT)将 D2 配置为方向控制引脚。保持 D2 为 LOW 选择接收模式。Serial1.available()检查缓冲区中的数据。readStringUntil('\n')读取一行,trim()去除首尾空白字符。message.length() > 0用于过滤空消息。有效的接收文本会通过 USB 串口监视器显示。
3. 测试结果
- 为每个 XIAO 打开 USB 串口监视器,以查看发送和接收的消息。

- 在数据传输过程中,板载 TX 和 RX 指示灯会闪烁以显示对应的活动。

软件方向到软件方向
在软件方向控制中,D2 用于选择工作模式:LOW 为接收,HIGH 为发送。
1. 发送端代码
#include <Arduino.h>
// Software -> Software: sender (XIAO ESP32C3, RS485 board V1.2).
// Fit R25/R26 for software direction; D2 controls transmit/receive.
void setup() {
Serial.begin(115200); // USB serial monitor.
Serial1.begin(9600, SERIAL_8N1, D5, D4); // RS485: RX=D5, TX=D4.
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW); // Keep RS485 in receive mode.
Serial.println("Software -> Software sender ready");
}
void loop() {
digitalWrite(D2, HIGH); // Enable RS485 transmission.
delayMicroseconds(100); // Allow the transceiver to switch.
Serial1.println("Hello from software sender"); // Send over the RS485 bus.
Serial1.flush(true); // Wait for TX only; keep RX buffer intact.
digitalWrite(D2, LOW); // Return to receive mode.
Serial.println("Sent: Hello from software sender"); // Show status via USB.
delay(1000);
}
Serial通过 USB 显示状态。Serial1通过 D4 以 9600 波特率发送 RS-485 数据。- D2 控制方向:LOW 选择接收模式,HIGH 选择发送模式。
- 在发送之前,程序将 D2 置为 HIGH,并短暂等待收发器切换模式。
Serial1.println()发送文本。Serial1.flush(true)在不清除接收数据的情况下等待 UART 发送完成。- 发送完成后,程序将 D2 置为 LOW,并通过 USB 显示本地发送状态。
2. 接收端代码
#include <Arduino.h>
// Software -> Software: receiver (XIAO ESP32C3, RS485 board V1.2).
// Fit R25/R26 for software direction; D2 stays LOW to receive.
void setup() {
Serial.begin(115200); // USB serial monitor.
Serial1.begin(9600, SERIAL_8N1, D5, D4); // RS485: RX=D5, TX=D4.
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW); // Keep RS485 in receive mode.
Serial.println("Software -> Software receiver ready");
}
void loop() {
if (Serial1.available()) {
String message = Serial1.readStringUntil('\n'); // Read one RS485 line.
message.trim();
if (message.length() > 0) {
Serial.print("Received: "); // Display on the USB serial monitor.
Serial.println(message);
}
}
}
Serial.begin(115200)启动 USB 串口输出。Serial1.begin(9600, SERIAL_8N1, D5, D4)启动 RS-485 UART,其中 RX 为 D5,TX 为 D4。- D2 被配置为方向控制引脚并保持为 LOW,使收发器保持在接收模式。
- 当
Serial1.available()报告有缓冲数据时,readStringUntil('\n')会读取一行。 trim()去除首尾空白字符。如果消息不为空,程序会通过 USB 显示它。
3. 测试结果
- 为每个 XIAO 打开 USB 串口监视器,以查看发送和接收的消息。

- 在数据传输过程中,板载 TX 和 RX 指示灯会闪烁以显示对应的活动。

资源
- 📄[原理图] Seeed Studio XIAO-RS485-Expansion-Board Schematic V1.2
- 🗃️[PCB 设计文件] Seeed Studio XIAO-RS485-Expansion-Board V1.2 Project
- 📄[原理图] Seeed Studio XIAO-RS485-Expansion-Board Schematic V1.1
- 🗃️[KiCad 原理图] Seeed Studio XIAO-RS485-Expansion-Board V1.1 SCH
技术支持与产品讨论
感谢您选择我们的产品!我们将为您提供多种支持,以确保您在使用我们产品时拥有尽可能顺畅的体验。我们提供多种沟通渠道,以满足不同的偏好和需求。


