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的块传输协议自己管流量,不需要底层帮忙。这个后面会细说。
报文格式:从字符到消息
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,覆盖整个块(包括长度字节)。
块传输协议:多块消息的“拼图”
一条SECS-II消息可能很长,但物理层一次只能传一个块。所以,多块消息需要拆成多个块,接收方再拼回去。
块传输协议的核心规则:
- 单块消息:控制字节的bit7=1,表示这是最后一块(也是唯一一块)。
- 多块消息:第一块bit7=0,中间块bit7=0,最后一块bit7=1。
- 块号连续:同一消息的块号必须连续递增(0,1,2,...)。
- 消息ID:每个块携带消息ID,接收方根据消息ID和块号重组。
举个例子:一条消息拆成3块,块号分别是0,1,2。控制字节的bit7依次为0,0,1。接收方收到块0和块1后,不会处理,直到收到块2(最后一块)才拼起来。
校验与重传机制:保证数据不丢不坏
物理层不可靠?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次)。超过次数,通信中断,上报错误。
知识结构图
下面这张图总结了SECS-I物理层的核心逻辑:
总结
SECS-I物理层虽然基于老旧的RS-232C,但通过精心设计的块格式、校验和重传机制,实现了可靠的半导体设备通信。我个人觉得,理解这层的关键在于:
- 三线制就够了——别画蛇添足加流控。
- 块号连续性——多块消息的命根子。
- CRC覆盖全块——偷懒只校验数据,迟早踩坑。
- 重传次数有限——别让设备死循环重传。
嗯,SECS-I物理层就这些。下一层是数据链路层,咱们到时候再聊。