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,记录 System Bytes,分配重组缓冲区。
- 接收中间块:验证块号连续递增(2, 3, ...),将数据追加到缓冲区。
- 接收尾块:块号为 0,将数据追加后,校验消息完整性(长度与校验和)。
- 超时处理:若在指定时间内未收到后续块,丢弃已接收数据并发送 NAK。
常见陷阱:多块消息重组时,若接收方缓冲区不足或块号乱序到达(如因线路噪声导致块丢失),必须启动超时定时器。建议设置 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 较小的一方退让,等待对方完成。
调试建议:在移植 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 功能的基础。