3. 数据链路层:帧结构定义、起始符与结束符、CRC校验原理、HDLC协议在轨道交通中的应用

各位好,欢迎来到第三讲。上一章我们聊了物理层那些事儿,说白了就是信号怎么在钢轨上跑起来。今天咱们往上走一层,看看数据链路层。这一层解决的核心问题是什么?我打个比方:物理层就像一条马路,数据链路层就是交通规则——你得告诉车怎么编队、怎么确认对方收到了、怎么发现丢包了。

在ATO(列车自动驾驶)系统里,地面设备和车载设备之间的通信,容不得半点马虎。你想想看,一列时速80公里的列车,如果因为一个比特错误导致误判了前方信号,那后果……嗯,我在项目现场见过一次因为CRC校验没通过导致的紧急制动,整个调度台都炸了锅。所以这一章的内容,我建议你逐字逐句吃透。

3.1 帧结构定义:数据怎么打包上路?

数据链路层把物理层的比特流组织成“帧”(Frame)。帧就像一封信,有信封、有正文、有落款。轨道交通里常用的帧结构,我习惯把它分成五个部分:

字段 长度(字节) 说明
起始符 1~2 标志帧的开始,常用0x7E
地址字段 1~2 标识发送方或接收方设备ID
控制字段 1 帧类型(数据帧/命令帧/应答帧)
信息字段 可变 真正的ATO指令数据,如目标速度、制动等级
帧校验序列(FCS) 2~4 CRC校验码,用于检错
结束符 1~2 标志帧的结束,常用0x7E

这里有个细节:起始符和结束符通常用同一个特殊字符,比如0x7E。为什么选这个值?因为0x7E的二进制是01111110,连续6个1,不容易在数据里出现。我曾经在调试一个老旧的ATO系统时,发现数据里偶尔会出现0x7E,结果接收端误判为帧边界,整个通信链路直接崩了。后来我们用了“比特填充”技术——连续5个1就插入一个0,这才彻底解决。

3.2 起始符与结束符:边界怎么定?

说白了,起始符和结束符就是帧的“门牌号”。接收端一看到0x7E,就知道“哦,新的一帧来了”。但问题来了:如果数据里恰好也有0x7E怎么办?

这就是HDLC协议里经典的“透明传输”问题。解决方案我总结为两种:

  • 比特填充法:发送端在数据中每遇到连续5个1,就自动插入一个0。接收端看到连续5个1后跟一个0,就把这个0删掉。这样0x7E(01111110)就不会在数据中出现了。
  • 字节填充法:用转义字符(如0x7D)标记。如果数据里出现0x7E,就发送0x7D 0x5E;如果出现0x7D,就发送0x7D 0x5D。

我个人更推荐比特填充法,尤其是在轨道交通这种高可靠性场景。为什么?因为比特填充只处理连续的1,不依赖特定字节值,对数据内容完全透明。我在北京某线路的ATO系统升级项目中,就坚持用了比特填充,后来联调时一次通过,没出过边界误判的问题。

3.3 CRC校验原理:怎么保证数据没被篡改?

CRC(循环冗余校验)是数据链路层的“守门员”。它的原理不复杂:把整个帧的数据看作一个巨大的二进制数,除以一个约定的生成多项式,余数就是CRC码。接收端用同样的多项式再除一遍,如果余数为0,说明数据没被改过。

举个例子,假设我们要发送数据1101,生成多项式是1011(对应x³ + x + 1):

1. 数据后补3个0(因为多项式最高次是3):1101000
2. 用1011做模2除法(不进位加法):
   1101000 ÷ 1011 = 商1110,余数001
3. 发送的实际数据:1101 + 001 = 1101001
4. 接收端收到1101001,用1011再除一次:
   如果余数为0,数据正确;否则丢弃并请求重发。

轨道交通里常用的CRC-16(多项式0x8005)和CRC-CCITT(多项式0x1021)。我建议你记住这两个,因为90%的ATO地面设备都在用它们。有一次我在现场排查一个偶发性的通信丢包问题,发现是CRC多项式配置错了——车载设备用0x8005,地面设备用0x1021,两边算出来的校验码对不上。折腾了三天才找到原因,从那以后我每次做系统集成,第一件事就是核对CRC参数。

避坑指南:我曾经见过一个项目,工程师为了省事,直接用求和校验代替CRC。结果列车在通过一个强电磁干扰区段时,数据被改了两个字节,但求和校验居然没发现!从那以后,我坚持所有ATO通信必须用CRC-16以上级别的校验。别省那点计算量,安全第一。

3.4 HDLC协议在轨道交通中的应用

HDLC(高级数据链路控制)协议,说白了就是数据链路层的“通用语言”。它定义了帧结构、差错控制、流量控制等一系列标准。轨道交通里,HDLC被广泛用在ATO、ATP(列车自动防护)、联锁系统之间的通信。

HDLC有三种帧类型:

  • 信息帧(I帧):携带用户数据,比如ATO发送的目标速度指令。需要确认。
  • 监控帧(S帧):用于流量控制和差错控制,比如“我收到了,请继续发”(RR帧)或“我没收到,请重发”(REJ帧)。
  • 无编号帧(U帧):用于链路建立、拆除等管理功能,比如“咱们建立连接吧”(SABM帧)。

在实际的轨道交通项目中,HDLC通常运行在RS-485或光纤环网上。我记得在深圳某地铁线的ATO系统调试中,地面设备每隔100ms向列车发送一次HDLC帧,包含前方信号机状态、限速信息、坡度数据等。列车收到后,必须在20ms内回复一个确认帧。如果连续3次没收到确认,地面设备就会触发紧急制动——这就是“超时重传”机制。

注意:HDLC的“平衡模式”(ABM)在轨道交通里用得最多。为什么?因为ATO和地面设备是对等关系,双方都能主动发起通信。不像主从模式,地面设备必须等轮询才能发数据。在高速运行场景下,ABM模式能减少一半的通信延迟。我参与过的项目里,只要列车速度超过120km/h,一律用ABM模式。

最后说一个实战经验:HDLC的“窗口大小”参数一定要根据线路长度和列车速度来调。窗口太大,重传时浪费带宽;窗口太小,通信效率低。我一般建议窗口大小设为4~7帧,这样在典型的2km轨旁通信区间内,既能保证吞吐量,又不会因为重传导致链路拥塞。

好了,这一章的内容就到这里。下一章我们会深入网络层,看看ATO系统的IP地址怎么规划、路由怎么走。有什么问题,欢迎在课后交流。