1、通信协议基础:什么是通信协议、为什么需要协议、协议分层模型(OSI与TCP/IP)

大家好,我是老张。做嵌入式这些年,从最早的51单片机到现在的ARM Cortex-M系列,我经手过不少气象站项目。今天咱们聊聊通信协议——这个听起来有点抽象,但实际工作中天天要打交道的玩意儿。

说实话,我刚入行那会儿,也觉得协议这东西挺虚的。不就是两个设备之间传数据吗?直接连根线,这边发那边收不就完了?后来被现实狠狠教育了一顿,才明白协议有多重要。

1.1 什么是通信协议

通信协议,说白了就是通信双方约定好的规则。就像两个人打电话,你得先拨号,对方接听,你说“喂”,对方回“喂”,然后才能开始聊正事。这些步骤就是通话的“协议”。

在嵌入式系统里,协议规定了:

  • 数据怎么编码——比如温度值是用二进制还是BCD码
  • 什么时候发——是主动上报还是查询应答
  • 发错了怎么办——要不要重传,怎么检测错误
  • 谁先说话——主从关系怎么定

我记得有一次做气象站,传感器和主控之间用的是UART直连。我心想这多简单,直接发数据不就行了?结果发现传感器时不时丢数据,主控收到的温度值忽高忽低。后来加了简单的校验和应答机制,问题才解决。嗯,这就是最朴素的“协议”思想。

核心要点:通信协议 = 语法(数据格式) + 语义(数据含义) + 时序(收发顺序)

1.2 为什么需要协议

你想想看,如果两个设备之间没有协议,会发生什么?

我给大家讲个真实案例。几年前有个同事做项目,用两个单片机通信。他图省事,没定义协议,直接往串口里丢数据。结果呢?发送端发的是“25.3”,接收端收到的是“0x32 0x35 0x2E 0x33”。接收端不知道这串数字是温度值,还是风速值,甚至不知道数据从哪里开始、到哪里结束。整个系统乱成一锅粥。

协议的作用,我总结为三点:

  1. 消除歧义——让接收方准确理解发送方的意图
  2. 保证可靠性——检测和纠正传输中的错误
  3. 管理通信流程——谁先发、发多久、发完怎么办

避坑指南:我曾经在一个项目中偷懒,用了“裸数据”传输。结果现场调试时,电磁干扰导致数据错位,整个系统崩溃。从那以后,我哪怕是最简单的I2C通信,也会加上帧头和校验。别嫌麻烦,协议就是你的保险。

1.3 协议分层模型

说到分层模型,很多初学者会觉得头大。OSI七层模型、TCP/IP四层模型……听着就复杂。其实没那么玄乎。

我习惯这么理解:分层就是把复杂问题拆成小块。每一层只关心自己的事,层与层之间通过接口交互。就像公司里,销售只管接单,研发只管开发,财务只管收钱。各司其职,出了问题也好定位。

1.3.1 OSI七层模型

OSI模型是国际标准化组织搞的,理论上很完美,但实际用得不多。不过它的分层思想值得学习。

层号 名称 作用 嵌入式中的例子
7 应用层 用户直接交互的接口 HTTP、MQTT、Modbus应用层
6 表示层 数据格式转换、加密 JSON/XML解析
5 会话层 建立、管理、终止会话 TCP连接管理
4 传输层 端到端可靠传输 TCP、UDP
3 网络层 路由选择、寻址 IP协议
2 数据链路层 帧封装、差错检测 以太网MAC、CAN总线
1 物理层 比特流传输、电气特性 RS-232、RS-485电平

说实话,做嵌入式气象站,我们很少用到完整的七层。但理解这个分层思想很有用。比如你调试Modbus协议时,如果通信不通,你可以一层层排查:物理层看电平对不对,链路层看帧格式对不对,应用层看寄存器地址对不对。这就是分层的好处。

1.3.2 TCP/IP四层模型

TCP/IP模型是实际工业界用的标准。它把OSI七层压缩成了四层:

  • 应用层——对应OSI的5、6、7层,直接面向用户
  • 传输层——对应OSI的第4层,负责端到端通信
  • 网络层——对应OSI的第3层,负责路由和寻址
  • 网络接口层——对应OSI的1、2层,负责物理传输

咱们气象站项目里,如果用以太网通信,用的就是TCP/IP模型。传感器数据通过应用层的MQTT协议打包,交给传输层的TCP保证可靠传输,再通过网络层的IP找到目标设备,最后通过网络接口层的以太网把数据发出去。

实际经验:我在做气象站网关时,遇到过一个问题:传感器数据通过4G模块上传到云平台,偶尔会丢包。排查后发现是传输层用了UDP,没有重传机制。后来改成TCP,问题解决。你看,这就是分层模型的价值——你能快速定位问题出在哪一层。

1.4 嵌入式通信协议的特点

跟PC上的通信协议不同,嵌入式系统有自己的特点:

  • 资源受限——RAM、Flash都有限,协议不能太复杂
  • 实时性要求高——气象数据要定时采集,不能延迟
  • 抗干扰能力——现场环境恶劣,协议要有容错机制
  • 低功耗——很多气象站靠电池供电,协议要省电

举个例子,Modbus协议在工业领域用得很多,因为它简单、可靠、占用资源少。一个完整的Modbus帧也就几个字节,非常适合单片机。而HTTP协议虽然功能强大,但报文太臃肿,在资源受限的嵌入式设备上跑起来很吃力。

注意事项:选择通信协议时,不要盲目追求功能全面。我见过有人用HTTP做传感器数据上传,结果一个数据包几百字节,电池两天就没电了。对于气象站这种场景,轻量级的MQTT或CoAP协议更合适。

1.5 小结

这一章我们聊了通信协议的基础。说白了,协议就是通信双方共同遵守的“交通规则”。没有规则,数据就会乱套。分层模型帮我们把复杂问题拆解成小块,每一层各司其职,出了问题也好排查。

下一章,我们会深入气象站最常用的串口通信协议。到时候我会拿实际项目中的代码给大家演示,怎么设计一个简单可靠的通信协议。咱们下期见。

课后思考:如果你现在要设计一个温湿度传感器和主控之间的通信协议,你会考虑哪些因素?不妨先自己想想,下一章我们一起来讨论。