串行通信协议详解
1. UART(通用异步收发传输器)
基本概念
UART是一种异步串行通信协议,使用两条数据线进行全双工通信。
物理特性
| 参数 | 说明 |
|---|---|
| 线路数量 | 2线(TX、RX)或3线(加上GND) |
| 通信方式 | 全双工 |
| 同步方式 | 异步 |
| 最大设备数 | 点对点 |
数据帧格式
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ S │D0│D1│D2│D3│D4│D5│D6│D7│ P │ E │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
S:起始位, D:数据位, P:校验位, E:停止位
代码示例
// Arduino串口示例
void setup() {
Serial.begin(9600); // 初始化串口,波特率9600
}
void loop() {
Serial.println("Hello World!");
if (Serial.available() > 0) {
String data = Serial.readString();
Serial.print("Received: ");
Serial.println(data);
}
delay(1000);
}
特点
-
✅ 优点: 简单、成本低、广泛支持
-
❌ 缺点: 速度较慢、传输距离有限
-
🎯 应用: 调试输出、GPS模块、蓝牙模块
2. I2C(内部集成电路)
基本概念
I2C是一种同步、多主从、半双工的串行通信总线。
物理特性
| 参数 | 说明 |
|---|---|
| 线路数量 | 2线(SDA、SCL) |
| 通信方式 | 半双工 |
| 同步方式 | 同步 |
| 最大设备数 | 理论128个(7位地址) |
通信时序
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ S │地址│ W │ACK│数据│ACK│数据│ACK│...│ P │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
S:起始条件, W:写位, ACK:应答, P:停止条件
代码示例
// Arduino I2C主设备示例
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
// 写入数据
Wire.beginTransmission(0x50);
Wire.write(0x00); // 内存地址
Wire.write(0xAB); // 数据
Wire.endTransmission();
delay(100);
// 读取数据
Wire.beginTransmission(0x50);
Wire.write(0x00);
Wire.endTransmission(false); // 重复起始条件
Wire.requestFrom(0x50, 1);
if (Wire.available()) {
byte data = Wire.read();
Serial.print("Read: 0x");
Serial.println(data, HEX);
}
delay(1000);
}
特点
-
✅ 优点: 引脚少、支持多设备、有ACK机制
-
❌ 缺点: 速度中等、协议相对复杂
-
🎯 应用: 传感器、EEPROM、RTC时钟
3. SPI(串行外设接口)
基本概念
SPI是一种同步、全双工的串行通信协议。
物理特性
| 参数 | 说明 |
|---|---|
| 线路数量 | 4线(MOSI、MISO、SCK、SS) |
| 通信方式 | 全双工 |
| 同步方式 | 同步 |
| 最大设备数 | 理论上无限制(每个从设备需要单独的SS) |
信号线说明
| 信号线 | 方向 | 描述 |
|---|---|---|
| MOSI | 主→从 | 主设备输出,从设备输入 |
| MISO | 从→主 | 主设备输入,从设备输出 |
| SCK | 主→从 | 时钟信号 |
| SS | 主→从 | 从设备选择(低电平有效) |
代码示例
// Arduino SPI主设备示例
#include <SPI.h>
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
}
void loop() {
digitalWrite(SS, LOW);
byte received = SPI.transfer(0x55);
digitalWrite(SS, HIGH);
Serial.print("Received: 0x");
Serial.println(received, HEX);
delay(1000);
}
特点
-
✅ 优点: 速度快、全双工、协议简单
-
❌ 缺点: 引脚多、不支持多主设备
-
🎯 应用: SD卡、显示屏、Flash存储器
4. USB(通用串行总线)
基本概念
USB是一种通用的高速串行总线标准,支持热插拔。
USB版本对比
| 版本 | 速度 | 发布时间 | 特点 |
|---|---|---|---|
| USB 1.0 | 1.5 Mbps | 1996年 | 最早版本 |
| USB 1.1 | 12 Mbps | 1998年 | 广泛使用 |
| USB 2.0 | 480 Mbps | 2000年 | 当前主流 |
| USB 3.0 | 5 Gbps | 2008年 | 蓝色接口 |
| USB 3.1 | 10 Gbps | 2013年 | Type-C接口 |
| USB 4.0 | 40 Gbps | 2019年 | 雷电3协议 |
代码示例
// Arduino作为USB键盘示例
#include "Keyboard.h"
void setup() {
Keyboard.begin();
delay(2000); // 等待电脑识别
}
void loop() {
Keyboard.print("Hello World!");
Keyboard.write(KEY_RETURN);
delay(5000);
}
USB设备类型
| 设备类 | 描述 | 示例 |
|---|---|---|
| HID | 人机接口设备 | 键盘、鼠标 |
| CDC | 通信设备类 | 虚拟串口 |
| MSC | 大容量存储 | U盘、移动硬盘 |
| Audio | 音频设备 | 麦克风、扬声器 |
特点
-
✅ 优点: 高速、热插拔、供电能力强
-
❌ 缺点: 协议复杂、开发难度大
-
🎯 应用: 外设连接、数据存储、音频设备
协议对比总结
| 特性 | UART | I2C | SPI | USB |
|---|---|---|---|---|
| 通信方式 | 异步 | 同步 | 同步 | 异步/同步 |
| 线路数量 | 2-3 | 2 | 4+ | 4+ |
| 最大速度 | ~115.2 kbps | ~3.4 Mbps | ~50 Mbps | ~40 Gbps |
| 传输距离 | 中等(15m) | 短(几米) | 短(几米) | 中等(5m) |
| 复杂度 | 低 | 中 | 中 | 高 |
| 成本 | 低 | 低 | 中 | 高 |
| 多设备支持 | ❌ | ✅ | ✅ | ✅ |
| 全双工 | ✅ | ❌ | ✅ | ✅ |
| 错误检测 | 可选校验 | ACK位 | 无 | CRC校验 |
协议选择指南
📍 何时使用UART
-
简单点对点通信
-
调试和信息输出
-
与电脑串口通信
-
成本敏感的应用
📍 何时使用I2C
-
连接多个低速设备
-
引脚数量受限
-
传感器网络
-
需要设备地址寻址
📍 何时使用SPI
-
需要高速数据传输
-
全双工通信
-
存储设备或显示屏
-
对引脚数量不敏感
📍 何时使用USB
-
与电脑高速连接
-
需要热插拔功能
-
复杂外设设备
-
需要总线供电
实际应用建议
🔧 开发复杂度
| 协议 | 硬件要求 | 软件复杂度 | 调试难度 |
|---|---|---|---|
| UART | 低 | 低 | 低 |
| I2C | 低 | 中 | 中 |
| SPI | 中 | 中 | 中 |
| USB | 高 | 高 | 高 |
💰 成本考虑
-
UART/I2C: 最低成本,适合大批量生产
-
SPI: 中等成本,性能与成本的平衡
-
USB: 最高成本,需要专用芯片和认证
⚡ 性能需求
-
低速应用: UART、I2C
-
中速应用: SPI
-
高速应用: USB
根据具体项目需求,综合考虑速度、成本、复杂度和设备数量等因素,选择最合适的通信协议。

被折叠的 条评论
为什么被折叠?



