3. 串口协议基础
串口通信的可靠性,首先取决于通信双方对“一帧数据长什么样”是否有一致理解。UART(通用异步收发器)没有时钟线,发送端和接收端只能依靠事先约定的波特率、数据位、停止位和校验位来对齐每一位。一旦这些参数不匹配,接收端就会在错误的位置采样,表现为乱码、丢帧或持续报错。因此,理解 UART 帧格式和参数关系,是工业串口故障诊断的第一道基本功。
一、UART 帧格式:一帧数据如何被“拼”出来
UART 以帧为单位传输数据。一个标准帧由起始位、数据位、可选校验位和停止位组成。空闲时线路保持高电平;发送端拉低一个位时间作为起始位,接收端检测到下降沿后开始按波特率采样;随后依次发送 5~9 位数据位,通常低位先发;若启用校验,则发送 1 位校验位;最后发送 1 位、1.5 位或 2 位停止位,线路回到高电平,准备下一帧。
以最常见的“8 数据位、无校验、1 停止位”为例,一帧共 10 位:1 位起始位 + 8 位数据位 + 1 位停止位。若波特率为 9600,则每位持续约 104.17 微秒,一帧约 1.04 毫秒。若加上奇偶校验,则一帧变为 11 位,传输时间相应增加。这个“位时间”概念在诊断中非常关键:示波器或逻辑分析仪上测得的位宽,可以直接反推实际波特率。
二、波特率、数据位、停止位与校验位
波特率表示每秒传输的码元数,在 UART 中通常等于每秒传输的位数。常见值有 9600、19200、38400、57600、115200 等。收发双方波特率必须一致,允许的误差通常在 2%~3% 以内;超过这个范围,采样点会逐渐偏移到相邻位,导致误码。工业现场中,长距离、强干扰环境应优先选择较低波特率,如 9600 或 19200,以换取更高的抗干扰裕量。
数据位表示每帧承载的有效数据位数,常见为 7 位或 8 位。7 位常用于早期 ASCII 通信,8 位则适合二进制数据和大多数工业协议。停止位用于给接收端提供帧结束标志和重新同步的时间,常见为 1 位或 2 位;在干扰较大或时钟偏差较大的场合,使用 2 位停止位可以增加容错。校验位分为无校验、奇校验和偶校验,用于检测单比特错误,但不能纠正错误,也不能发现多比特错误。
| 参数 | 常见取值 | 作用 | 诊断要点 |
|---|---|---|---|
| 波特率 | 9600 / 19200 / 115200 | 决定位时间与采样节奏 | 双方必须一致,误差小于 2%~3% |
| 数据位 | 7 / 8 | 每帧有效数据长度 | 与协议定义一致,否则解析错位 |
| 停止位 | 1 / 1.5 / 2 | 帧结束与重新同步 | 干扰大时可用 2 位提高容错 |
| 校验位 | None / Odd / Even | 检测单比特错误 | 不能纠错,需与对端一致 |
| 流控 | 无 / RTS-CTS / XON-XOFF | 防止缓冲区溢出 | 硬件流控需交叉连接并启用 |
三、流控机制:什么时候需要“踩刹车”
流控用于协调收发速度,防止接收端缓冲区溢出。常见方式有两种:硬件流控和软件流控。硬件流控使用 RTS(请求发送)和 CTS(清除发送)两根信号线,发送端在 CTS 有效时才发送数据;软件流控则使用 XON(0x11)和 XOFF(0x13)字符控制发送节奏。工业设备中,若数据量大、接收端处理慢,建议启用 RTS-CTS 硬件流控;若只使用三线(TXD、RXD、GND)连接,则只能依赖软件流控或不使用流控。
提示:很多“串口能发不能收”或“大数据量时丢包”的问题,根源不是线缆,而是流控未启用或 RTS/CTS 未交叉连接。诊断时应先确认双方流控配置是否一致。
四、典型故障场景与排查流程
假设一台 PLC 通过 RS-232 与工控机通信,工控机收到的是乱码。排查时可按以下顺序进行:
- 确认双方波特率是否一致,例如 PLC 为 9600,工控机误设为 115200。
- 确认数据位、停止位、校验位是否一致,常见错误是 PLC 为 8-E-1,工控机为 8-N-1。
- 用示波器测量 TXD 波形,计算最小位宽,反推实际波特率。
- 检查流控配置,若启用 RTS-CTS,确认线序是否正确交叉。
- 检查地线是否共地,RS-232 单端信号对共地要求较高。
典型参数配置示例(Linux 串口工具):
stty -F /dev/ttyS0 9600 cs8 -cstopb -parenb -crtscts
# 9600 波特率,8 数据位,1 停止位,无校验,启用 RTS/CTS 硬件流控
若改为偶校验、2 停止位:
stty -F /dev/ttyS0 9600 cs8 cstopb parenb -parodd -crtscts
# parenb 启用校验,-parodd 表示偶校验,cstopb 表示 2 位停止位
注意:校验位只能发现部分错误,不能替代 CRC。工业协议如 Modbus RTU 使用 CRC 校验,UART 的奇偶校验只是链路层的第一道防线。诊断时不要因为“校验通过”就认为数据一定正确。
五、复盘:参数一致性是串口通信的底线
UART 帧格式、波特率、数据位、停止位、校验位和流控机制,共同构成串口通信的“契约”。任何一项不一致,都会导致通信失败或数据错误。实际排障中,建议先记录双方完整参数,再用示波器或串口调试助手验证波形和字节流,最后检查流控和地线。把参数一致性检查作为固定步骤,可以显著缩短故障定位时间。