SECS-I物理层:RS-232C电气特性、报文格式、块传输协议、校验与重传机制

各位工程师,大家好。今天我们聊SECS-I物理层。说白了,SECS-I就是定义数据怎么在设备之间“跑”起来的底层规则。它基于RS-232C,但又不完全是RS-232C。我当年第一次调试SECS-I时,以为接上串口线就能通,结果折腾了一整天——后来才发现,坑都在细节里。

RS-232C电气特性:不只是三根线

RS-232C是上世纪60年代的标准,但SECS-I选它,图的就是简单可靠。不过,SECS-I对RS-232C做了一些“定制”。

参数 RS-232C标准 SECS-I要求
信号电平 ±3V ~ ±15V ±5V ~ ±12V(推荐)
最大距离 约15米 建议≤15米,实际我见过20米也能跑
连接器 DB-25 DB-25或DB-9,常用DB-25
接线方式 全双工 三线制(TXD, RXD, GND)
注意:SECS-I强制使用三线制,不启用硬件流控(RTS/CTS)。我曾经遇到一个项目,现场工程师自作主张接了流控线,结果设备死活连不上。查了两天才发现是流控冲突。

你可能会问:为什么不用硬件流控?因为SECS-I的块传输协议自己管流量,不需要底层帮忙。这个后面会细说。

报文格式:从字符到消息

SECS-I的报文分三层:字符、块、消息。咱们从最小的单位说起。

字符格式

每个字符10位:1个起始位(0),8个数据位,1个奇校验位,1个停止位(1)。波特率固定为9600 bps。

关键点:奇校验是强制要求。我见过有人为了省事改成无校验,结果数据偶尔出错,查了三天才发现是校验位不对。

块(Block)格式

一个块由若干字符组成,结构如下:

| 长度字节 (LEN) | 块号 (BLK) | 设备ID (DEVID) | 控制字节 (CTRL) | 数据 (DATA) | 校验和 (CHK) |
| 1 byte         | 1 byte     | 1 byte          | 1 byte          | 0-254 bytes | 2 bytes     |
  • 长度字节:表示整个块的总字节数(包括自身)。范围4-254。
  • 块号:从0开始,每发一块加1,循环使用0-127。
  • 设备ID:主机和设备各有一个ID,用于区分。
  • 控制字节:标识块类型(数据块、控制块、重传请求等)。
  • 数据:最多254字节,实际受长度限制。
  • 校验和:16位CRC,覆盖整个块(包括长度字节)。
经验之谈:块号为什么只到127?因为SECS-I用7位表示块号,最高位留给重传标志。这个设计很巧妙——重传时不需要额外字段。

块传输协议:多块消息的“拼图”

一条SECS-II消息可能很长,但物理层一次只能传一个块。所以,多块消息需要拆成多个块,接收方再拼回去。

块传输协议的核心规则:

  1. 单块消息:控制字节的bit7=1,表示这是最后一块(也是唯一一块)。
  2. 多块消息:第一块bit7=0,中间块bit7=0,最后一块bit7=1。
  3. 块号连续:同一消息的块号必须连续递增(0,1,2,...)。
  4. 消息ID:每个块携带消息ID,接收方根据消息ID和块号重组。

举个例子:一条消息拆成3块,块号分别是0,1,2。控制字节的bit7依次为0,0,1。接收方收到块0和块1后,不会处理,直到收到块2(最后一块)才拼起来。

避坑指南:我曾经遇到一个设备,发送多块消息时块号不连续(跳过了某个数)。接收方直接丢弃整条消息,导致通信中断。排查后发现是固件bug。所以,块号连续性一定要严格检查。

校验与重传机制:保证数据不丢不坏

物理层不可靠?SECS-I用两招搞定:CRC校验和超时重传。

CRC校验

每个块末尾有2字节CRC-16,多项式是x^16 + x^15 + x^2 + 1(标准CRC-16-IBM)。计算范围从长度字节开始,到数据结束。

接收方收到块后,重新计算CRC,与收到的CRC比较。不一致就丢弃,并请求重传。

注意:CRC校验覆盖整个块,包括长度字节和块号。这意味着任何字节出错都能检测到。我见过有人只校验数据部分,结果长度字节出错导致解析错误——这是典型的半吊子实现。

重传机制

重传分两种:

  • 超时重传:发送方发出块后,启动定时器(T1,默认1秒)。如果超时未收到确认,重传该块。
  • NACK重传:接收方发现CRC错误或块号异常,发送NACK(否定确认),发送方立即重传。

确认机制很简单:

  • ACK:控制字节的特定值(0x06),表示块接收成功。
  • NACK:控制字节的特定值(0x15),表示块接收失败,请求重传。

重传次数有限制(通常3次)。超过次数,通信中断,上报错误。

我的习惯:调试时把T1设大一点(比如3秒),避免误判超时。等通信稳定后再改回1秒。另外,重传计数器一定要清零——我见过一个设备重传成功后计数器没清零,结果下次通信直接报错。

知识结构图

下面这张图总结了SECS-I物理层的核心逻辑:

SECS-I物理层知识结构 SECS-I物理层核心结构 RS-232C 电气层 字符格式 块格式 消息格式 块传输协议(多块拼装、块号管理) CRC-16 校验 超时/NACK 重传 说明:SECS-I物理层自底向上分为电气层、报文层、传输层和可靠性层,层层依赖。 实际调试时,建议从底层向上逐层验证,避免跨层排查。

总结

SECS-I物理层虽然基于老旧的RS-232C,但通过精心设计的块格式、校验和重传机制,实现了可靠的半导体设备通信。我个人觉得,理解这层的关键在于:

  • 三线制就够了——别画蛇添足加流控。
  • 块号连续性——多块消息的命根子。
  • CRC覆盖全块——偷懒只校验数据,迟早踩坑。
  • 重传次数有限——别让设备死循环重传。

嗯,SECS-I物理层就这些。下一层是数据链路层,咱们到时候再聊。