串行通信协议

串行通信协议详解

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.01.5 Mbps1996年最早版本
USB 1.112 Mbps1998年广泛使用
USB 2.0480 Mbps2000年当前主流
USB 3.05 Gbps2008年蓝色接口
USB 3.110 Gbps2013年Type-C接口
USB 4.040 Gbps2019年雷电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音频设备麦克风、扬声器

特点

  • 优点: 高速、热插拔、供电能力强

  • 缺点: 协议复杂、开发难度大

  • 🎯 应用: 外设连接、数据存储、音频设备


协议对比总结

特性UARTI2CSPIUSB
通信方式异步同步同步异步/同步
线路数量2-324+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

根据具体项目需求,综合考虑速度、成本、复杂度和设备数量等因素,选择最合适的通信协议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值