一、串口数据帧的基本结构
串口通信(UART/RS-232)以"帧"(frame)为单位传输数据。每一帧由起始位、数据位、可选的校验位和停止位组成。这种结构称为异步串行帧格式,其核心特征是无需独立的时钟信号线——接收端依靠帧内的起始位和停止位实现位同步。
以最常见的配置 8N1(8 数据位、无校验、1 停止位)为例,每帧共占用 10 位:1 位起始位(固定为低电平 → 高电平跳变)、8 位数据位(LSB first)、1 位停止位(固定为高电平)。接收端的 UART 芯片检测到从高到低的电平跳变即识别为新帧的开始,随后依次接收数据位,最后通过停止位确认帧结束。
RS-232 标准本身并不规定字符编码或帧格式——这些由具体的 UART 硬件和上层协议决定。TIA/EIA-232-F(1997 年)主要定义电气特性和连接拓扑,而帧格式参数由通信双方的应用层软件协商。正因如此,同一套 RS-232 硬件在不同参数配置下可能正常工作也可能出现乱码,理解帧结构是排查通信故障的基础。
二、波特率:传输速度的基准
波特率(Baud Rate)是串口通信中最基本的参数,定义每秒钟传输的符号数。在 RS-232 的二进制调制模式下,1 波特 = 1 bit/s,因此"波特率"与"比特率"在串口通信语境中可视为同义词。常见的工控波特率有:9600、19200、38400、57600、115200 bps。
波特率的选择需要在速度与可靠性之间权衡:
- 低速(9600–38400 bps):传输距离长、抗干扰能力强,适用于噪声环境较差的工业现场。RS-232 标准推荐的最大传输距离(约 15 m)针对的是 9600–19200 bps 范围。
- 中速(57600–115200 bps):适用于短距离、低噪声的环境,如设备调试串口。
- 高速(≥ 230400 bps):依赖专用的短距离线缆和低噪声环境,在工控设备中较少使用,常见于特定仪器接口。
波特率越高,同一时间内传输的数据量越大,但有效传输距离越短。波特率不匹配是串口通信中最常见的故障原因——发送端与接收端的波特率不一致时,接收端无法正确解析位时序,产生乱码或完全无响应。
三、数据位:有效载荷的宽度
数据位(Data Bits)定义每帧中传输的有效数据位数。常见的选项为 5、6、7 或 8 位:
- 8 位:最常用,对应一个完整字节(0–255),可直接传输二进制数据。几乎所有现代工控设备均采用 8 位数据位。
- 7 位:对应标准 ASCII 字符集(0–127),常见于历史遗留设备和基于文本的通信协议。在 Modbus ASCII 模式中,数据位固定为 7 位。
- 5 位或 6 位:用于传输 ITA2(Baudot)编码等特殊字符集,在工控中极少使用。
数据位的选择受校验位的影响:若启用校验位,数据位 + 校验位合计不超过 8 位的限制(部分 UART 硬件限制单帧不超过 9 位)。在实际的工控配置中,8 位数据位 + 无校验是最通用的组合,兼容性最好。
四、停止位:帧结束的标志
停止位(Stop Bits)是每帧末尾发送的高电平信号,用于通知接收端一帧数据已经结束。停止位可选 1、1.5 或 2 位:
- 1 位停止位:最常用,适用于 8 位数据位配置。帧总体开销为 2 位(1 起始 + 1 停止),效率最高。
- 1.5 位停止位:仅用于 5 位数据位配置,使用一种 1.5 倍位宽的高电平信号作为停止位。
- 2 位停止位:用于机械传输速度较慢的设备(如早期的电传打字机),或时钟振荡精度较差的接收端。2 位停止位提供更长的帧间隔,允许接收方有更多时间处理数据,但有效数据传输率相应降低。
停止位的长度直接影响帧效率和数据传输速率:以 8N1 为例,每帧 10 位中有效数据占 8 位,帧效率为 80%。在 115200 bps 的波特率下,每秒可传输约 11,520 帧,每帧携带 1 字节有效数据,因此有效数据率约为 11,520 字节/秒。改为 8N2(8 数据位、无校验、2 停止位)后,每帧 11 位,效率降至约 72.7%,有效数据率约为 10,473 字节/秒。
五、校验位:基本的错误检测机制
校验位(Parity Bit)是一种简单的错误检测机制,通过在每帧末尾添加一位冗余信息,使接收端能够检测部分传输错误。校验位的设置包括以下几种:
- 无校验(N):不添加校验位,帧中只有数据位和停止位。最常用的配置,依赖于上层协议(如 Modbus CRC、XMODEM 校验和)完成错误检测。
- 偶校验(E):校验位取 0 或 1,使得数据位 + 校验位的"1"的个数为偶数。接收端统计"1"的个数,若为奇数则认为传输有误。
- 奇校验(O):校验位取 0 或 1,使得数据位 + 校验位的"1"的个数为奇数。
- Mark 校验(M):校验位固定为 1(Mark 信号),不提供错误检测功能。
- Space 校验(S):校验位固定为 0(Space 信号),同样不提供错误检测功能。
奇偶校验仅能检测奇数个位翻转错误,对于偶数个位翻转无法识别。在噪声干扰较小的环境下,无校验 + 上层协议校验是更合理的选择;在噪声较强但上层协议较弱的场景下,启用偶校验可提供基本的错误检测。Mark 和 Space 校验在现代工控中极少独立使用,它们主要用于检测接收端是否已正确同步。
校验位的存在会影响帧效率:启用校验位后,部分 UART 配置要求将数据位调整为 7 位,使每帧总有效载荷仍为 8 位。以 7E1(7 数据位、偶校验、1 停止位)为例,每帧共 10 位(1+7+1+1),其中有效数据为 7 位,帧效率为 70%。在 115200 bps 下,有效数据率约为 10,080 字节/秒。
六、帧效率与有效数据率的计算
帧效率(Frame Efficiency)= 数据位 / 帧总位数的比值,直接决定了在给定波特率下的有效数据传输率。以下为常见配置在 115200 bps 下的对比:
| 配置 | 帧结构(位) | 每帧总位数 | 帧效率 | 有效数据率(@115200 bps) |
|---|---|---|---|---|
| 8N1 | 1+8+0+1 | 10 | 80.0% | 约 11,520 字节/秒 |
| 8N2 | 1+8+0+2 | 11 | 72.7% | 约 10,473 字节/秒 |
| 8E1 | 1+8+1+1 | 11 | 72.7% | 约 10,473 字节/秒 |
| 7E1 | 1+7+1+1 | 10 | 70.0% | 约 10,080 字节/秒 |
| 7O2 | 1+7+1+2 | 11 | 63.6% | 约 9,164 字节/秒 |
在实际工控应用中,8N1 是最优选择:帧效率最高、兼容性最广、配置最简单。仅在连接历史遗留设备(如仅支持 7 位 ASCII 的终端)或特殊协议(如 Modbus ASCII 要求 7 位数据位)时,才需要调整数据位和校验位。
有效数据率计算公式:有效数据率(字节/秒)= 波特率 ÷ 每帧总位数 × 数据位数 ÷ 8。以 8N1 为例:115200 ÷ 10 × 8 ÷ 8 = 11,520 字节/秒。
七、工控串口参数配置实践
在工业现场配置串口通信参数时,需按以下顺序确认:
- 查阅设备文档:PLC、变频器、传感器等工控设备的串口参数通常在用户手册中明确标注,常见的出厂配置为 9600 8N1 或 115200 8N1。
- 确认通信双方参数一致:波特率、数据位、校验位和停止位四个参数必须在发送端与接收端完全一致。任何一项不匹配都会导致通信失败或数据错误。
- 选择校验方式:优先使用无校验 + 上层协议校验(如 Modbus RTU 采用 CRC-16)。若设备不支持上层校验且噪声水平较高,可使用偶校验。
- 验证帧效率:在满足设备要求的前提下,选择帧效率最高的参数组合,即 8N1。
通过 Linux 下的 stty 或 Windows 下的终端软件,可以查看和修改串口参数:
- Linux:
stty -F /dev/ttyS0查看当前配置;stty -F /dev/ttyS0 9600 cs8 -parenb -cstopb设置 9600 8N1。 - Windows:通过设备管理器查看 "COM" 端口属性,或使用串口调试工具(如 SSCOM、RealTerm)配置参数。
八、常见参数不匹配问题排查
串口参数配置错误通常表现为以下症状:
- 乱码字符:波特率不一致时最常见的现象,接收端以错误的位时序解析数据位,导致 ASCII 字符完全被错误解码。
- 数据丢失或重复:校验位不匹配会导致接收端丢弃部分帧;停止位不匹配可能导致帧同步错误,出现连续多个帧被错误地解析为一个帧。
- 完全无响应:数据位或校验位的严重不匹配可能使接收端无法识别任何有效帧。
排查步骤:1)使用示波器或逻辑分析仪检查电平跳变频率以确认波特率;2)逐项核对设备的通信参数文档;3)在终端软件中尝试不同的参数组合(从 9600 8N1 开始逐一尝试)。
串口通信帧格式参数的选择直接关系到工业通信的可靠性与效率。理解起始位、数据位、校验位和停止位各自的作用与相互影响,有助于工程师在设备对接和故障排查中快速定位问题,减少现场调试时间。