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)、连接建立与释放、以及数据帧的封装与确认机制。

SECS/GEM 协议栈分层模型 GEM (应用层) SECS-II (消息层) SECS-I (数据链路层) RS-232C (物理层) SECS-I 负责将 SECS-II 消息块封装为数据帧,通过 RS-232 串口发送并确认

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 字节(含头部)。

SECS-I 数据帧结构(Block Format) SECS-I 帧:长度 10 ~ 254 字节 Length Device ID R/W Stream Function Block E-bit Data(0~244 字节) Checksum Length 字段表示整个帧的字节数(含 Length 自身),最小 10 字节(无数据),最大 254 字节 Checksum 为帧头 + 数据所有字节的累加和(忽略进位),用于检测传输错误

帧字段详细说明:

  • 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)来保证数据帧的完整性。发送方计算校验和并附加在帧尾,接收方重新计算并与接收到的校验和比较,不一致则要求重传。

校验和计算步骤:

  1. 将帧头(Length 到 E-bit)与 Data 字段的所有字节视为一个字节序列。
  2. 将每个字节视为 8 位无符号整数,依次累加。
  3. 累加过程中只保留低 16 位(即对 65536 取模)。
  4. 将最终的 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 的通信过程分为三个阶段:连接建立、数据交换、连接释放。每个阶段都有特定的控制帧。

SECS-I 通信流程(三次握手与数据交换) 主机 (Host) 设备 (Equipment) 阶段一:连接建立(三次握手) 1. ENQ (Enquiry) 2. ACK (Acknowledge) 3. ENQ (确认连接建立) 阶段二:数据交换(多帧传输) 4. 数据帧 (Block 1, E-bit=0) 5. ACK (确认接收) 6. 数据帧 (Block 2, E-bit=1) 7. ACK (确认接收) 阶段三:连接释放 8. EOT (End of Transmission) 9. ACK (确认释放) 控制帧:ENQ (0x05)、ACK (0x06)、NAK (0x15)、EOT (0x04) 均为单字节帧,无 Data 和 Checksum

控制帧定义:

控制帧 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 次