2. SECS-I 协议详解:RS-232 物理层、块传输协议、消息格式与校验重传
SECS-I 是 SEMI Equipment Communications Standard 1 的简称,定义了 SECS/GEM 通信栈中最底层的物理连接与数据链路层规范。它规定了设备与主机之间如何通过 RS-232 串行接口进行字节传输、如何将字节组装成块(Block)、如何将块组合成消息(Message),以及如何通过校验与重传机制保证数据的可靠性。本章将逐层拆解 SECS-I 的核心机制。
2.1 RS-232 物理层与电气特性
SECS-I 物理层基于 EIA RS-232-C 标准,采用点对点串行通信。在实际产线集成中,需重点关注以下参数:
| 参数 | SECS-I 规定值 | 说明 |
|---|---|---|
| 传输速率 | 9600 bps(默认) | 可协商为 19200、38400 等,但产线通常固定 9600 |
| 数据位 | 7 位 | ASCII 字符集,第 8 位用于校验 |
| 停止位 | 1 位 | 固定值 |
| 奇偶校验 | 偶校验(Even) | 保证字节级传输正确性 |
| 信号电平 | ±3V ~ ±15V | RS-232 标准电压范围 |
| 连接器 | DB-25 或 DB-9 | 通常使用 DB-9,仅需 3 根线(TX、RX、GND) |
产线集成提示: 许多老旧半导体设备仍使用 DB-25 母头。若主机侧为 DB-9,需制作转接线,注意 TX/RX 交叉连接(Null Modem 方式)。
2.2 块传输协议(Block Transfer Protocol)
SECS-I 将上层消息切分为固定大小的数据块(Block)进行传输。每个块是物理层传输的最小独立单元,包含块头(Block Header)和数据区(Data Area)。
2.2.1 块结构
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| Length Byte | 1 | 块总长度(含 Length 自身),范围 10~254 字节 |
| Device ID | 1 | 设备标识,0x00 通常代表主机 |
| Message ID | 1 | 消息编号,用于消息重组 |
| Block Number | 1 | 块序号,从 0 开始递增 |
| System Bytes | 2 | 系统字节,用于事务匹配 |
| Data | 可变 | 实际数据内容,最大 244 字节 |
| Checksum | 2 | CRC-16 校验和 |
关键约束: 单个块最大长度为 254 字节(含头尾)。若消息超过 244 字节数据区,必须拆分为多个块传输。
2.2.2 多块消息重组
当消息长度超过单块容量时,发送方将消息拆分为多个块,接收方根据 Message ID 和 Block Number 重组完整消息。重组规则如下:
- 首块标志: Block Number = 0 表示消息的第一个块。
- 末块标志: 若块数据区长度 < 244 字节,或块总长度 < 254 字节,则该块为消息的最后一个块。
- 超时机制: 若接收方在 T3 时间内未收到后续块,则丢弃已接收的部分并触发重传请求。
常见错误: 部分设备在末块中填充 0x00 至 244 字节,导致接收方误判还有后续块。集成测试时必须验证末块判定逻辑。
2.3 消息格式(Message Format)
SECS-I 消息由若干块组成,消息本身不额外添加头部,而是通过块头中的字段隐式定义消息边界。消息格式分为两种类型:
| 消息类型 | 方向 | 说明 |
|---|---|---|
| Primary Message | 主机 → 设备 或 设备 → 主机 | 主动发起的请求或数据 |
| Reply Message | 与 Primary 相反方向 | 对 Primary 的响应,必须携带相同的 System Bytes |
消息的完整生命周期包含以下步骤:
- 发送方构造消息,分配唯一的 System Bytes(2 字节)。
- 若消息长度 > 244 字节,拆分为多个块,依次发送。
- 接收方收到所有块后,按 Block Number 顺序重组为完整消息。
- 接收方处理消息,构造 Reply Message,使用相同的 System Bytes 返回。
- 发送方收到 Reply 后,释放 System Bytes 资源。
2.4 校验与重传机制
SECS-I 通过 CRC-16 校验和与超时重传机制保证数据传输的可靠性。两者协同工作,确保物理层错误或丢包能被检测并恢复。
2.4.1 CRC-16 校验
每个块尾部包含 2 字节 CRC-16 校验和,计算范围覆盖整个块(Length 字节到 Data 区末尾)。生成多项式为:
CRC-16-IBM: x¹⁶ + x¹⁵ + x² + 1 (0x8005)
初始值: 0x0000
计算示例(伪代码):
uint16_t crc16(uint8_t *data, int len) {
uint16_t crc = 0x0000;
for (int i = 0; i < len; i++) {
crc ^= data[i];
for (int j = 0; j < 8; j++) {
if (crc & 0x0001)
crc = (crc >> 1) ^ 0xA001;
else
crc >>= 1;
}
}
return crc;
}
校验流程: 接收方计算收到块的 CRC,与块尾的 CRC 字段比较。若不一致,则丢弃该块并等待重传。
2.4.2 超时与重传
SECS-I 定义了三个关键超时定时器,用于控制重传行为:
| 定时器 | 默认值 | 触发条件 | 动作 |
|---|---|---|---|
| T1 | 1.0 秒 | 发送块后未收到 ACK | 重传该块,最多重试 3 次 |
| T2 | 10.0 秒 | 发送消息后未收到 Reply | 重传整个消息,最多重试 3 次 |
| T3 | 45.0 秒 | 多块消息中块间间隔超时 | 丢弃已收块,等待发送方重传 |
重传机制遵循以下规则:
- 发送方在 T1 超时后重传当前块,块内容不变。
- 接收方收到重复块时,若已正确接收则丢弃重复块并重新发送 ACK。
- 若重试 3 次后仍未收到 ACK,发送方断开连接并上报通信错误。
- T2 超时通常由应用层处理,SECS-I 仅负责块级重传。
2.5 本章小结
SECS-I 协议通过 RS-232 物理层、块传输协议、消息格式与校验重传机制,为上层 SECS-II 消息提供了可靠的传输通道。在产线集成中,需重点检查以下内容:
- 物理连接: 确认 RS-232 参数(9600, 7, E, 1)一致,TX/RX 交叉正确。
- 块结构: 验证块头字段(Device ID、Message ID、Block Number、System Bytes)的填充逻辑。
- 消息重组: 测试多块消息的拆分与重组,特别是末块判定条件。
- 校验与重传: 模拟 CRC 错误和超时场景,验证重传机制是否符合 SECS-I 规范。
实战建议: 使用串口抓包工具(如 Free Serial Monitor)捕获原始字节流,逐字节解析块结构,是排查 SECS-I 层问题的最有效手段。