3. SECS-I 通信基础:协议定义、RS-232 与数据帧校验
SECS-I(SEMI Equipment Communications Standard 1)是 SEMI 标准 E4 定义的物理层与数据链路层协议,负责在主机(Host)与设备(Equipment)之间通过 RS-232C 串行接口进行可靠的点对点数据传输。它是 SECS/GEM 协议栈的最底层基石,为上层 SECS-II 消息提供无差错、面向连接的字节流服务。
核心要点:SECS-I 不关心消息内容(那是 SECS-II 的工作),只负责将字节块按固定帧格式打包、通过 RS-232 发送、并确保接收方通过校验确认数据完整性。
3.1 SECS-I 协议定义与分层位置
在 SEMI 标准分层模型中,SECS-I 位于物理层和数据链路层。它定义了电气特性(RS-232C)、连接建立与释放、以及数据帧的封装与确认机制。
3.2 RS-232C 串口通信参数
SECS-I 强制使用 RS-232C 接口,通信参数必须严格按照 SEMI E4 标准配置,否则设备与主机无法建立连接。
| 参数项 | 标准值 | 说明 |
|---|---|---|
| 波特率 | 9600 bps(默认) | 可协商为 19200、38400 等,但初始连接必须从 9600 开始 |
| 数据位 | 7 位 | ASCII 字符传输,第 8 位用于奇偶校验 |
| 停止位 | 1 位 | 固定为 1 位停止位 |
| 奇偶校验 | 偶校验(Even) | 确保字节级传输错误可被检测 |
| 流控制 | 硬件流控制(RTS/CTS) | 防止接收缓冲区溢出 |
| 连接方式 | 点对点(Point-to-Point) | 一个主机只能连接一台设备 |
工程经验:在实际部署中,RS-232 线缆长度不应超过 15 米。若距离较远,需使用 RS-232 转 RS-422/485 转换器或串口服务器。波特率越高,传输距离越短。
3.3 SECS-I 数据帧格式
SECS-I 将数据封装为固定格式的帧(Block),每个帧包含以下字段。帧的最大长度为 254 字节(含头部)。
帧字段详细说明:
- Length(1 字节):整个帧的字节数,包括 Length 自身。取值范围 10~254。
- Device ID(1 字节):设备标识符,用于区分同一链路上的多个设备(通常为 0)。
- R/W(1 位):读写标志,0 表示读取(Reply),1 表示写入(Message)。
- Stream(1 字节):消息流编号,范围 0~127。
- Function(1 字节):功能码,范围 0~255。
- Block(1 字节):块序号,用于多块消息重组。
- E-bit(1 位):结束位,1 表示最后一个块,0 表示后续还有块。
- Data(0~244 字节):SECS-II 消息负载。
- Checksum(2 字节):从 Length 到 Data 末尾所有字节的累加和(16 位,忽略溢出)。
3.4 校验机制:Checksum 计算与验证
SECS-I 使用 16 位累加和校验(Sum Check)来保证数据帧的完整性。发送方计算校验和并附加在帧尾,接收方重新计算并与接收到的校验和比较,不一致则要求重传。
校验和计算步骤:
- 将帧头(Length 到 E-bit)与 Data 字段的所有字节视为一个字节序列。
- 将每个字节视为 8 位无符号整数,依次累加。
- 累加过程中只保留低 16 位(即对 65536 取模)。
- 将最终的 16 位结果拆分为高字节和低字节,附加到帧末尾。
校验示例:假设帧头 + 数据字节序列为 [0x0A, 0x00, 0x81, 0x01, 0x00, 0x00, 0x00, 0x00],累加和 = 0x0A + 0x00 + 0x81 + 0x01 + 0x00 + 0x00 + 0x00 + 0x00 = 0x8C。则 Checksum 字段为 [0x00, 0x8C](高字节在前)。
// SECS-I 校验和计算示例(C 语言风格)
unsigned short calculate_checksum(unsigned char *frame, int length) {
unsigned short sum = 0;
for (int i = 0; i < length; i++) {
sum += frame[i]; // 累加每个字节
// 16 位溢出自动丢弃(unsigned short 自动取模 65536)
}
return sum;
}
// 发送方调用
unsigned char frame[256];
int frame_len = 10; // 假设帧长度为 10
unsigned short cs = calculate_checksum(frame, frame_len - 2);
frame[frame_len - 2] = (cs >> 8) & 0xFF; // 高字节
frame[frame_len - 1] = cs & 0xFF; // 低字节
// 接收方验证
unsigned short received_cs = (frame[frame_len - 2] << 8) | frame[frame_len - 1];
unsigned short calc_cs = calculate_checksum(frame, frame_len - 2);
if (received_cs == calc_cs) {
// 校验通过,处理帧
} else {
// 校验失败,请求重传
}
3.5 SECS-I 通信流程:连接与数据交换
SECS-I 的通信过程分为三个阶段:连接建立、数据交换、连接释放。每个阶段都有特定的控制帧。
控制帧定义:
| 控制帧 | ASCII 码 | 十六进制 | 用途 |
|---|---|---|---|
| ENQ | Ctrl-E | 0x05 | 请求建立连接或请求发送数据 |
| ACK | Ctrl-F | 0x06 | 确认接收,表示帧校验正确 |
| NAK | Ctrl-U | 0x15 | 否认接收,表示帧校验错误,请求重传 |
| EOT | Ctrl-D | 0x04 | 结束传输,释放连接 |
常见错误:若接收方连续收到 3 次校验错误的帧(即连续发送 3 次 NAK),则通信双方应断开连接并重新进行三次握手。这是 SECS-I 的健壮性设计,防止线路故障导致数据无限重传。
3.6 超时与重传机制
SECS-I 定义了严格的超时参数,确保通信的可靠性。每个帧发送后,发送方必须等待接收方的 ACK/NAK 响应,超时未收到则重传。
| 超时参数 | 默认值 | 说明 |
|---|---|---|
| T1 | 1.0 秒 | 发送数据帧后等待 ACK/NAK 的最大时间 |
| T2 | 10.0 秒 | 接收方处理数据帧的最大时间(从收到帧到发出响应) |
| T3 | 45.0 秒 | 等待对方发送 ENQ 的最大时间(连接建立阶段) |
| 重试次数 | 3 次 | 同一帧连续重传的最大次数,超过则断开连接 |
调优建议:在高速设备(如每秒传输多个帧)中,T1 可适当降低至 500ms 以提高吞吐量。但 T2 必须大于设备处理一个帧的最大时间,否则会导致误重传。
3.7 本章小结
SECS-I 作为 SECS/GEM 协议栈的底层基石,通过 RS-232C 串口和严谨的帧格式、校验机制、超时重传策略,为上层 SECS-II 消息提供了可靠的数据传输服务。理解 SECS-I 的帧结构、校验计算和通信流程,是后续学习 SECS-II 消息封装与 GEM 状态机的基础。
| 知识点 | 关键内容 |
|---|---|
| 协议标准 | SEMI E4,物理层 + 数据链路层 |
| 物理接口 | RS-232C,9600 bps,7 数据位,偶校验,1 停止位 |
| 帧最大长度 | 254 字节(含头部) |
| 校验方式 | 16 位累加和校验(Sum Check) |
| 控制帧 | ENQ (0x05)、ACK (0x06)、NAK (0x15)、EOT (0x04) |
| 超时参数 | T1=1s, T2=10s, T3=45s,最大重试 3 次 |