Skip to content

Arduino - 通信

在微控制器世界中,通信至关重要。你的 Arduino 需要与计算机、传感器和其他芯片进行通信。虽然有许多通信协议,但最基础的是串口通信 (Serial Communication)。本章重点介绍 UART(异步收发传输器),这是 Arduino 内置 Serial 对象使用的协议。

并行通信 (Parallel Communication) 通过多根线同时发送多个数据位。它速度很快,但需要大量 I/O 引脚,这在微控制器上是宝贵的资源。串行通信 (Serial Communication) 则通过单根线(外加一根公共地线)一次发送一个数据位。它速度较慢,但在引脚使用方面效率高得多,使其成为大多数微控制器任务的主导方法。

Arduino 的 Serial 通信是异步的,这意味着它不使用共享时钟信号。为了确保发送方和接收方同步,它们必须事先约定一套规则:

  • 波特率 (Baud Rate):通信速度,以每秒位数 (bps) 衡量。两台设备必须设置为相同的波特率。常用值为 9600。
  • 数据帧 (Data Frame):每块数据都以数据包或帧的形式发送,其中包括:
    • 起始位 (Start Bit):一个信号位,表示新帧的开始(从高到低的转换)。
    • 数据位 (Data Bits):实际数据,通常是 8 位(一个字节)。
    • 奇偶校验位 (Parity Bit)(可选):一个额外的位,用于基本的错误检查。
    • 停止位 (Stop Bit(s)):一到两位,表示帧的结束(转换回高电平)。

在 Arduino UNO 上,Serial 对象指的是连接到数字引脚 0 (RX - 接收) 和 1 (TX - 发送) 的内置硬件 UART。这些引脚也连接到 USB 转串口芯片,使你的 Arduino 能够与计算机的串口监视器 (Serial Monitor) 通信。

最佳实践:如果你正在使用 Serial 进行调试,请避免将引脚 0 和 1 用于通用 I/O(如 LED 或按钮),因为它可能会干扰代码上传和通信。

  • Serial.begin(speed):初始化串口通信并设置波特率(例如,Serial.begin(9600))。
  • Serial.available():返回可从串口缓冲区读取的字节数(字符数)。
  • Serial.read():读取一个传入的串口数据字节。
  • Serial.print(data):以人类可读的 ASCII 文本格式将数据打印到串口。
  • Serial.println(data):与 print() 相同,但在末尾添加回车符和换行符。
  • Serial.write(data):将原始二进制数据(一个字节或一系列字节)写入串口。

代码示例:一个简单的命令解释器

Section titled “代码示例:一个简单的命令解释器”

这个高级示例演示了如何从串口监视器读取字符串,并让 Arduino 根据命令执行操作。

/*
串口命令解释器
监听来自串口监视器的 'ON' 或 'OFF' 命令
以控制板载 LED。
*/
const int LED_PIN = LED_BUILTIN; // 使用板载 LED
void setup() {
// 以 9600 bps 的波特率开始串口通信
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
Serial.println("Arduino 已准备就绪。");
Serial.println("发送 'ON' 打开 LED,发送 'OFF' 关闭 LED。");
}
void loop() {
// 检查是否有数据可读
if (Serial.available() > 0) {
// 将接收到的命令作为字符串读取,直到收到换行符
String command = Serial.readStringUntil('\n');
// 移除任何开头/结尾的空白字符
command.trim();
if (command.equalsIgnoreCase("ON")) {
digitalWrite(LED_PIN, HIGH);
Serial.println("命令已接收:ON。LED 现已开启。");
} else if (command.equalsIgnoreCase("OFF")) {
digitalWrite(LED_PIN, LOW);
Serial.println("命令已接收:OFF。LED 现已关闭。");
} else {
Serial.print("未知命令:");
Serial.println(command);
}
}
}

尽管 UART 非常适合计算机到 Arduino 或简单的点对点通信,但 Arduino 还支持其他串行协议以完成更复杂的任务:

  • I2C (Inter-Integrated Circuit):一种两线协议(SDA 和 SCL),允许你将多个设备(传感器、显示器等)连接到同一总线。每个设备都有一个唯一的地址。
  • SPI (Serial Peripheral Interface):一种更快的四线协议,常用于高带宽设备,如 SD 卡读卡器、以太网模块和某些显示器类型。