第二章 通信协议基础:OSI七层模型、TCP/IP协议栈、串行通信与并行通信、同步与异步通信
各位同学,欢迎来到通信协议基础这一章。说实话,我做了十几年嵌入式系统,见过太多因为通信协议没选对、没理解透而导致项目翻车的案例。今天这一章,咱们就把通信协议的老底儿给掀开,看看它到底是怎么工作的。
2.1 OSI七层模型:通信界的「通用语言」
先聊聊OSI七层模型。这东西听起来高大上,其实说白了,就是国际标准化组织(ISO)给通信系统定的一套「分层干活」的规矩。为什么要分层?你想想看,如果所有通信功能都揉在一起,改一个地方就得动全身,那谁受得了?
OSI模型把通信过程拆成了七层,从下往上分别是:
- 物理层:管的是比特流在物理介质上的传输。比如电压高低、光信号强弱、引脚怎么接。我当年调试一个RS-485总线,死活通不了,最后发现是A/B线接反了——这就是物理层的问题。
- 数据链路层:把物理层的比特流组装成帧,加上MAC地址,做差错控制。以太网、Wi-Fi都在这一层。
- 网络层:负责路由和寻址。IP协议就在这层,它决定了数据包怎么从A点跑到B点。
- 传输层:提供端到端的可靠传输。TCP和UDP是这层的代表。一个靠谱,一个快,看你选哪个。
- 会话层:管理会话的建立、维持和终止。嗯,这一层在实际应用中经常被合并到上层。
- 表示层:处理数据格式、加密、压缩。比如你发个中文,对方收到乱码,那就是表示层没处理好编码。
- 应用层:直接面向用户。HTTP、FTP、MQTT都在这一层。
核心要点:每一层只关心自己的事,下层为上层提供服务。这种「各司其职」的思想,在嵌入式系统设计中同样适用。
我在项目中遇到过一件事:有个同事非要在应用层自己实现重传机制,结果和底层的TCP重传打架,导致数据乱套。这就是没理解分层模型——每一层做好自己的事就够了,别越俎代庖。
2.2 TCP/IP协议栈:互联网的「事实标准」
OSI七层模型是理论上的完美方案,但实际互联网用的是TCP/IP协议栈。它只有四层:
| TCP/IP层 | 对应OSI层 | 常见协议 |
|---|---|---|
| 应用层 | 应用层、表示层、会话层 | HTTP, MQTT, CoAP |
| 传输层 | 传输层 | TCP, UDP |
| 网络层 | 网络层 | IP, ICMP |
| 网络接口层 | 数据链路层、物理层 | 以太网, Wi-Fi |
说白了,TCP/IP就是把OSI的上三层合并成了应用层,下两层合并成了网络接口层。简洁实用,这也是它能成为事实标准的原因。
我建议你在做嵌入式网络通信时,重点关注传输层。TCP适合对可靠性要求高的场景,比如固件升级;UDP适合实时性要求高的场景,比如视频流。选错了,项目就得返工。
避坑指南:我曾经在一个物联网项目中用了TCP,结果设备在弱网环境下频繁重连,功耗飙升。后来换成UDP+应用层轻量确认,问题就解决了。记住:不是所有场景都需要TCP的「可靠」。
2.3 串行通信与并行通信:一根线 vs 一堆线
接下来聊聊物理层面的通信方式。串行通信和并行通信,本质区别在于数据传输的「车道数」。
- 串行通信:一次只传1位数据,用一根数据线。比如UART、I2C、SPI。优点是线少、抗干扰强、传输距离远。缺点是速度相对慢(但现代串行技术已经很快了)。
- 并行通信:一次传多位数据,用多根数据线。比如并口、DDR内存总线。优点是速度快,缺点是线多、成本高、抗干扰差。
你可能会问:「既然并行快,为什么现在串行反而更流行?」嗯,这个问题问得好。原因有三:
- 时钟同步问题:并行通信的多根线很难做到完全同步,频率一高就出问题。
- 串扰问题:线多了,互相干扰就严重。
- 成本问题:线多意味着引脚多、PCB面积大、连接器贵。
所以你看,现在高速接口如USB 3.0、PCIe、SATA,全是串行的。这就是技术发展的趋势——用更少的线,跑更快的速度。
实战建议:在视觉仿生系统中,传感器和处理器之间的通信,我推荐用串行方式。比如用MIPI CSI接口传输摄像头数据,用SPI或I2C传输控制指令。线少,布线方便,抗干扰也好。
2.4 同步与异步通信:时钟的「默契」
最后聊聊同步和异步通信。这俩概念经常有人搞混,我尽量用大白话讲清楚。
- 同步通信:发送方和接收方共用同一个时钟信号。数据在时钟的节拍下传输。比如I2C、SPI都是同步通信。优点是传输效率高,缺点是双方必须严格同步,距离远了容易出问题。
- 异步通信:双方没有共同时钟,靠约定的波特率来「猜」数据。比如UART就是异步通信。优点是线少(只需要TX、RX两根线),缺点是效率低一些,因为要加起始位和停止位。
我举个例子你就明白了。同步通信就像两个人一起喊口号:「一二一、一二一」,步调一致。异步通信就像两个人各自按自己的节奏走,但约定好「每秒钟走两步」,然后靠对方的脚步声来对齐。
注意:异步通信的波特率必须一致,否则数据会错乱。我曾经调试一个UART设备,数据全是乱码,查了半天发现是波特率设成了9600和115200——差了整整12倍。这种低级错误,犯一次就长记性了。
在视觉仿生系统中,我一般这样选:
- 传感器和主控芯片之间距离近、要求速度快,用同步通信(如SPI)。
- 和外部设备(如调试电脑、无线模块)通信,距离远、线数有限,用异步通信(如UART)。
本章知识体系图
下面这张图,是我用SVG画的本章知识结构。你可以把它当作一张「通信协议地图」,随时回来看看。
好了,这一章的内容就到这里。通信协议这东西,光看理论是不够的,你得在实际项目中多踩坑、多总结。下一章我们会深入视觉仿生系统的具体通信需求,看看这些协议怎么落地。
公众号:蓝海资料掘金营,微信deep3321