目录
1. 串口协议的三层结构:
层次 | 功能描述 | 主要内容 | 实例协议 |
物理层 |
负责数据传输的物理媒介和硬件接口 |
电压电平、波特率、传输介质、接头类型 |
RS-232、RS-485、TTL |
数据链路层 |
负责将数据封装成帧并处理错误检测、流量控制和同步 |
数据帧(起始位、数据位、停止位、校验位)、错误检测、流量控制 |
UART、Modbus RTU、XMODEM |
应用层 |
负责定义数据格式、命令和响应,实现与上层应用的交互 |
命令、数据格式、响应内容 |
Modbus、AT命令、NMEA 0183 |
2. 物理层(Physical Layer)
物理层负责数据的实际传输,即通过电缆、无线等媒介发送和接收比特流。这一层定义了串口通信所需的硬件标准和传输介质。
功能和内容:
-
信号传输:定义了通过串口传输的信号类型(如电平、频率等),通常使用的是RS-232、RS-485、TTL(Transistor-Transistor Logic)等标准。
-
电压电平:不同标准会有不同的电压电平来表示“0”和“1”。例如,RS-232通常使用 +12V 和 -12V 来表示逻辑“0”和“1”。
-
传输速率:规定了数据传输的速率(波特率),例如 9600、115200、921600 bps 等。
-
接头和接口标准:物理连接标准(例如 DB9、DB25 接口)。
典型标准:
-
RS-232:常用于计算机与外设的串行连接,最大传输距离一般为15米,速度从300 bps到115200 bps不等。
-
RS-485:适用于远距离或多点通信,支持更高的抗干扰能力。
-
TTL:通常用于短距离设备间的通信,电平为0V和3.3V(或5V)。
3. 数据链路层(Data Link Layer)
数据链路层负责将物理层提供的比特流转化为可管理的数据帧,并处理可靠性问题。它确保了数据的正确传输,并负责错误检测和纠正。
功能和内容:
-
数据帧封装:这一层把数据封装成帧,包括帧头、数据部分和校验部分。数据帧可能会带有一些控制信息,如起始位、停止位、校验位等。
-
起始位:标识数据帧的开始。
-
数据位:实际传输的数据,通常为8位。
-
停止位:标识数据帧的结束。
-
校验位:用于检测数据是否出错(如奇偶校验)。
-
-
错误检测和纠正:数据链路层会检查数据的完整性,通常使用校验位或校验和来检测传输错误。若发现错误,数据链路层负责请求重发数据。
-
流量控制:在一些协议中,数据链路层还负责流量控制,确保发送方不会发送超过接收方处理能力的数据量。
典型的协议:
-
RS-232 和 RS-485 是常见的串口协议的物理层标准,而 UART、Modbus RTU、XMODEM 等则通常在数据链路层运行。
3.1 UART协议概述
UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信接口,用于串口通信,是嵌入式系统中非常常见的硬件模块。UART 是一种点对点通信协议,广泛用于嵌入式系统、计算机、传感器、模块等设备之间的数据传输。
3.1.1 UART 数据帧结构
字段 | 描述 |
起始位(Start Bit) | 数据帧以 1 个低电平(0) 开头,表示通信的开始 |
数据位(Data Bits) | 实际传输的数据,通常为 5~9 位(常见为 8 位) |
校验位(Parity Bit,非必需) | 可选位,用于检测数据传输错误。类型包括奇校验(Odd Parity)或偶校验(Even Parity) |
停止位(Stop Bit) | 数据帧结束的标志,通常为 1 个或 2 个高电平(1) |
3.1.2 典型数据帧结构
| Start Bit | Data Bits (8) | Parity Bit (Optional) | Stop Bit (1/2) |
例如,常见的 UART 数据帧为 8N1:
-
8:8 个数据位。
-
N:无校验位(None)。
-
1:1 个停止位。
3.1.3 常用物理层标准
-
RS-232:
-
早期的串口通信标准,支持点对点通信。
-
电压范围:-15V~+15V,噪声抗干扰能力较差。
-
-
RS-485:
-
半双工通信,支持多点通信(最多 32 台设备)。
-
电压范围:差分信号,+5V 和 -5V,抗干扰能力较强。
-
常用于工业控制场景。
-
-
TTL:
-
电压范围:电平为0V和3.3V(或5V)
-
常用于短距离通信
-
3.2 Modbus RTU 协议概述
Modbus RTU 是一种广泛应用于工业自动化领域的串行通信协议,尤其用于在设备之间传输数据。Modbus RTU 是 Modbus 协议 的一种实现方式,特别适用于串行通信(如 RS-232 或 RS-485)中,常用于连接PLC、传感器、执行器和其他设备。
3.2.1 Modbus RTU 消息格式
字段 |
长度(位) |
描述 |
地址字段 |
8位 |
表示目标设备的地址。有效范围是 1 至 247 |
功能码 |
8 位 |
定义了从设备执行的操作(如读取或写入) |
数据字段 |
可变长度 |
包含请求或响应的数据,具体内容取决于功能码 |
CRC 校验码 |
16 位 |
用于检测数据的完整性和传输过程中的错误 |
3.2.2 Modbus RTU 数据帧示例
假设主设备发送一个读取保持寄存器(功能码 0x03
)的请求,目标设备地址为 0x01
,读取 2 个寄存器,每个寄存器 16 位(2 字节)
请求数据帧:
| 地址 | 功能码 | 数据长度 | 数据 | CRC |
|-------|--------|----------|--------------|------|
| 0x01 | 0x03 | 0x02 | 0x00 0x02 | CRC |
-
地址:
0x01
,目标设备地址 -
功能码:
0x03
,表示读取保持寄存器 -
数据长度:
0x02
,表示请求读取 2 个寄存器 -
数据:
0x00 0x02
,表示读取的数据或命令 -
CRC:校验和,用于确保数据传输的完整性
响应数据帧(假设设备返回两个寄存器的值 0x0010
和 0x0020
):
| 地址 | 功能码 | 字节数 | 数据 | CRC |
|-------|--------|--------|-------------------- |
| 0x01 | 0x03 | 0x04 | 0x00 0x10 0x00 0x20 | CRC |
-
地址:
0x01
,目标设备地址 -
功能码:
0x03
,表示读取保持寄存器 -
字节数:
0x04
,表示返回 4 个字节的数据 -
数据:
0x00 0x10 0x00 0x20
,表示读取的 2 个寄存器的值 -
CRC:校验和
4. 应用层(Application Layer)
应用层负责与应用程序的交互,是串口协议的最高层,主要用于控制和管理数据的传输内容和格式。应用层协议定义了数据的格式、命令、响应以及如何解释这些数据。
功能和内容:
-
协议格式和语法:定义如何格式化发送和接收的数据。例如,一些串口协议可能规定数据帧中应包含特定的命令、数据字段和响应。
-
命令和响应:应用层会定义不同的命令和相应的响应。例如,传感器设备可能通过串口接收查询命令并返回传感器数据。
-
数据解析与处理:应用层还会负责接收到的数据的解析和处理。收到的数据将被转换成具体的业务数据,如设备的状态、传感器测量值等。
常见协议示例:
-
Modbus:一种广泛用于工业自动化的串口通信协议,定义了设备如何通过串口请求数据或发送命令。
-
AT命令:用于控制调制解调器或手机等设备的通信命令集。
-
NMEA 0183:用于船舶和航空电子设备的通信协议,定义了GPS设备、导航设备如何通过串口传递信息。