Arduino - 通信
Arduino - 串口通信 (UART)
Section titled “Arduino - 串口通信 (UART)”在微控制器世界中,通信至关重要。你的 Arduino 需要与计算机、传感器和其他芯片进行通信。虽然有许多通信协议,但最基础的是串口通信 (Serial Communication)。本章重点介绍 UART(异步收发传输器),这是 Arduino 内置 Serial 对象使用的协议。
并行通信与串行通信
Section titled “并行通信与串行通信”并行通信 (Parallel Communication) 通过多根线同时发送多个数据位。它速度很快,但需要大量 I/O 引脚,这在微控制器上是宝贵的资源。串行通信 (Serial Communication) 则通过单根线(外加一根公共地线)一次发送一个数据位。它速度较慢,但在引脚使用方面效率高得多,使其成为大多数微控制器任务的主导方法。
异步串行协议
Section titled “异步串行协议”Arduino 的 Serial 通信是异步的,这意味着它不使用共享时钟信号。为了确保发送方和接收方同步,它们必须事先约定一套规则:
- 波特率 (Baud Rate):通信速度,以每秒位数 (bps) 衡量。两台设备必须设置为相同的波特率。常用值为
9600。 - 数据帧 (Data Frame):每块数据都以数据包或帧的形式发送,其中包括:
-
- 起始位 (Start Bit):一个信号位,表示新帧的开始(从高到低的转换)。
-
- 数据位 (Data Bits):实际数据,通常是 8 位(一个字节)。
-
- 奇偶校验位 (Parity Bit)(可选):一个额外的位,用于基本的错误检查。
-
- 停止位 (Stop Bit(s)):一到两位,表示帧的结束(转换回高电平)。
Arduino Serial 对象
Section titled “Arduino Serial 对象”在 Arduino UNO 上,Serial 对象指的是连接到数字引脚 0 (RX - 接收) 和 1 (TX - 发送) 的内置硬件 UART。这些引脚也连接到 USB 转串口芯片,使你的 Arduino 能够与计算机的串口监视器 (Serial Monitor) 通信。
最佳实践:如果你正在使用 Serial 进行调试,请避免将引脚 0 和 1 用于通用 I/O(如 LED 或按钮),因为它可能会干扰代码上传和通信。
核心 Serial 函数
Section titled “核心 Serial 函数”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:I2C 和 SPI 概述
Section titled “超越 UART:I2C 和 SPI 概述”尽管 UART 非常适合计算机到 Arduino 或简单的点对点通信,但 Arduino 还支持其他串行协议以完成更复杂的任务:
- I2C (Inter-Integrated Circuit):一种两线协议(
SDA和SCL),允许你将多个设备(传感器、显示器等)连接到同一总线。每个设备都有一个唯一的地址。 - SPI (Serial Peripheral Interface):一种更快的四线协议,常用于高带宽设备,如 SD 卡读卡器、以太网模块和某些显示器类型。