4. SECS-I 通信协议详解:RS-232 物理层、块传输协议、多块消息重组、超时与错误处理

SECS-I(SEMI Equipment Communications Standard 1)是 SECS/GEM 协议栈的物理层与数据链路层标准,定义了在 RS-232 串行接口上传输 SECS 消息的电气特性、帧格式、流控机制及错误恢复规则。本章将深入剖析 SECS-I 的核心要素,为后续协议栈移植与调试奠定基础。

4.1 RS-232 物理层规范

SECS-I 物理层基于 EIA RS-232-C 标准,采用点对点全双工异步串行通信。关键电气与连接参数如下表所示:

参数 规范值 说明
信号电平 逻辑 1: -5V ~ -15V
逻辑 0: +5V ~ +15V
采用负逻辑,与 TTL 电平不兼容,需电平转换芯片(如 MAX232)
连接器 DB-25 或 DB-9 推荐使用 DB-25,但实际设备中 DB-9 更常见
最小信号线 3 线:TXD、RXD、GND 硬件流控(RTS/CTS)为可选,SECS-I 主要依赖软件流控
波特率 9600 bps(默认)
可选项:19200、38400、57600
SEMI 标准推荐 9600,高速场景需双方协商一致
数据位 7 位或 8 位 SECS-I 消息为 8 位字节,通常使用 8 位数据位
停止位 1 位 标准配置
校验位 无(None) 错误检测由块传输协议中的校验和完成
移植要点:在嵌入式系统中,RS-232 驱动通常通过 UART 外设实现。需注意 UART 的 FIFO 深度与中断优先级设置,避免在高速率(如 57600 bps)下因响应延迟导致数据丢失。建议使用 DMA 模式传输大块数据。

4.2 块传输协议(Block Transfer Protocol)

SECS-I 将上层 SECS-II 消息分割为多个数据块(Block)进行传输。每个块是物理层传输的最小单元,包含块头(Block Header)和数据区(Data Area)。块结构如下:

+--------+--------+--------+--------+--------+--------+--------+--------+
|  Byte0 |  Byte1 |  Byte2 |  Byte3 |  Byte4 |  Byte5 |  ...   |  ByteN |
+--------+--------+--------+--------+--------+--------+--------+--------+
|  Device ID / Block Type  |  Block Number  |  System Bytes  |  Data  |
|  (2 bytes)               |  (1 byte)      |  (2 bytes)     |  (0-244 bytes) |
+--------+--------+--------+--------+--------+--------+--------+--------+
|<------------------- Block Header (5 bytes) ------------------>|<--- Data --->|

块头字段详解:

  • Device ID / Block Type(2 字节):
    • Bit 15:控制位(C-bit)。0 表示消息块,1 表示控制块(如 ENQ、ACK、NAK)。
    • Bit 14-0:设备 ID(Device ID)。用于标识通信对端,范围 0-32767。
  • Block Number(1 字节):
    • 取值范围 0-127。0 表示该块是消息的最后一个块(End Block),1-127 表示中间块。
    • 多块消息中,块号从 1 开始递增,最后一块的块号为 0。
  • System Bytes(2 字节):
    • 系统字节,用于关联请求与响应消息。发送方设置,接收方在响应中回显相同值。
    • 在多块消息中,同一消息的所有块共享相同的 System Bytes。
  • Data(0-244 字节):
    • 块数据区,最大长度 244 字节。整个块(含头)不超过 254 字节。
块长度计算:块头固定 5 字节,数据区最大 244 字节,因此单块最大长度为 249 字节。加上 RS-232 的起始位/停止位开销,实际传输效率约为 96%(249/254)。

4.3 多块消息重组机制

当 SECS-II 消息长度超过 244 字节时,发送方将其分割为多个块进行传输。接收方需根据块号与 System Bytes 完成重组。重组流程如下:

  1. 接收首块:检查块号是否为 1,记录 System Bytes,分配重组缓冲区。
  2. 接收中间块:验证块号连续递增(2, 3, ...),将数据追加到缓冲区。
  3. 接收尾块:块号为 0,将数据追加后,校验消息完整性(长度与校验和)。
  4. 超时处理:若在指定时间内未收到后续块,丢弃已接收数据并发送 NAK。
多块消息重组流程 发送方(Host/Equipment) 接收方(Equipment/Host) 块1 (Block#=1) 分配缓冲区 块2 (Block#=2) 追加数据 尾块 (Block#=0) 重组完成 + 校验 发送 ACK
常见陷阱:多块消息重组时,若接收方缓冲区不足或块号乱序到达(如因线路噪声导致块丢失),必须启动超时定时器。建议设置 T3 定时器(块间超时)为 10 秒,超时后发送 NAK 并清空缓冲区。

4.4 超时与错误处理机制

SECS-I 定义了 5 种关键定时器,用于保障通信可靠性。定时器参数如下:

定时器 默认值 触发条件 超时动作
T1 1.0 秒 发送块后等待 ACK/NAK 重传块(最多 3 次),之后报告通信失败
T2 10.0 秒 接收方等待下一个块(多块消息) 发送 NAK,丢弃已接收块
T3 45.0 秒 发送方等待响应消息(SECS-II 级别) 报告事务超时,由上层处理
T4 45.0 秒 接收方等待下一个消息 断开连接或进入空闲状态
T5 10.0 秒 控制块(ENQ)等待响应 重试 ENQ,最多 3 次

错误处理流程:

  • 校验和错误:接收方计算块内所有字节的累加和(忽略进位),与块尾的校验和字节比较。不匹配则发送 NAK,发送方重传该块。
  • 块号错误:若接收到的块号不连续(如跳号),发送 NAK 并请求重传缺失块。
  • 重复块:若收到已确认的块号,直接丢弃并重新发送 ACK。
  • ENQ 冲突:双方同时发送 ENQ 时,设备 ID 较小的一方退让,等待对方完成。
超时与重传状态机 空闲 发送块 等待 ACK 重传块 通信失败 发送请求 块发送完成 T1 超时 重试 < 3 重试 ≥ 3 收到 ACK
调试建议:在移植 SECS-I 协议栈时,建议在串口驱动层增加环形缓冲区(Ring Buffer)与超时钩子函数。通过日志输出每个块的收发时间戳与块号,可快速定位超时或丢块问题。使用逻辑分析仪抓取 RS-232 电平波形,验证波特率与帧格式是否匹配。

4.5 控制块与流控

SECS-I 使用控制块实现链路层流控与同步。控制块通过 Device ID 字段的 C-bit(Bit 15)标识,常见控制块类型如下:

控制块 编码 方向 作用
ENQ 0x05 双向 请求发送数据,用于建立通信会话
ACK 0x06 双向 确认块接收正确
NAK 0x15 双向 拒绝块,请求重传
EOT 0x04 双向 传输结束,释放链路

流控规则:

  • 发送方在发送数据块前必须先发送 ENQ,收到 ACK 后方可发送。
  • 接收方在收到完整消息(多块重组完成)后发送 ACK。
  • 若接收方缓冲区满,可发送 NAK 或延迟响应,迫使发送方等待。
  • 连续 3 次 NAK 或超时后,发送方应终止传输并报告错误。
性能优化:在高速设备(如 57600 bps)中,建议启用硬件流控(RTS/CTS)以减少 CPU 开销。若使用软件流控(XON/XOFF),需注意与 SECS-I 控制块(ENQ/ACK/NAK)的优先级冲突,避免死锁。

通过本章的学习,您应掌握 SECS-I 的物理层配置、块结构解析、多块重组逻辑以及超时/错误处理状态机。这些知识是后续实现 SECS-II 消息封装与 GEM 功能的基础。