4. 诊断协议栈概览
整车诊断不是单一协议在工作,而是一组标准按“应用—传输—网络—物理”逐层协作。理解协议栈的关键,是把“诊断服务语义”和“报文如何被搬运”分开看:ISO 14229 负责“说什么”,ISO 15765/ISO 13400/ISO 14230 负责“怎么送”,物理层标准负责“用什么电信号送”。
一、核心原理:诊断协议的分层模型
在工程实践中,常把诊断栈类比为 OSI 七层模型的裁剪版。最上层是应用层,定义诊断服务、请求/响应格式、否定响应码;中间是传输层与会话层,负责分包、重组、流控、寻址;下层是数据链路层与物理层,决定 CAN、CAN FD、DoIP、K-Line 等具体承载方式。
以 UDS(ISO 14229)为例,一条 0x22 ReadDataByIdentifier 请求,在应用层是“读 DID 0xF190”;到了 ISO 15765-2 传输层,可能被拆成首帧、连续帧、流控帧;到了 CAN 数据链路层,变成 11 位或 29 位 CAN ID 加 8/64 字节数据;最后物理层以差分电平发送到总线。接收端反向重组,最终把正响应交给应用层解析。
二、主要协议定位与关系
ISO 14229(UDS)是统一诊断服务,定义 0x10、0x11、0x14、0x19、0x22、0x27、0x2E、0x31、0x3E、0x85 等服务,以及会话、安全访问、DTC、例程控制等机制。它本身不规定报文如何分包,因此必须搭配传输协议。
ISO 15765(DoCAN)是 CAN 上的诊断传输协议,其中 ISO 15765-2 定义网络层与传输层,支持单帧、首帧、连续帧、流控帧,是当前最主流的车载诊断承载。ISO 15765-3/4 涉及诊断通信管理,工程中常与 UDS 组合使用。
ISO 13400(DoIP)是 IP 网络上的诊断协议,基于以太网、TCP/UDP,适合高带宽场景,如刷写、大数据量读取、自动驾驶域控制器诊断。DoIP 有车辆发现、路由激活、诊断报文、状态查询等机制,常与 ISO 14229 配合。
ISO 14230(KWP2000)是 K-Line 上的诊断协议,早期车型和部分摩托车、商用车仍可见。它定义了 5 波特率初始化、快速初始化、报文格式等,传输速率低,但物理连接简单。
SAE J1939 主要面向商用车,基于 CAN 29 位扩展帧,定义 PGN、SPN、DM1/DM2 等参数组与诊断报文。它不仅是诊断协议,也是一套完整的车辆网络应用层标准,与 UDS 在乘用车上的定位不同。
三、方法流程:一次诊断请求的栈内旅程
以“读取 VIN(DID 0xF190)”为例,诊断仪发出请求后,协议栈按以下顺序工作:
- 应用层构造 UDS 请求:
22 F1 90。 - 传输层判断长度,若为经典 CAN 且数据不超过 7 字节,使用单帧;否则拆为首帧与连续帧。
- 网络层加上寻址信息,如功能寻址
0x7DF或物理寻址0x7E0。 - 数据链路层封装为 CAN 帧,物理层发送到总线。
- ECU 接收后逐层解包,应用层执行服务并返回
62 F1 90 ...。 - 诊断仪重组响应,应用层解析 VIN 字符串。
请求示例(UDS over CAN):
发送 ID: 0x7E0 数据: 03 22 F1 90 AA AA AA AA
响应 ID: 0x7E8 数据: 10 14 62 F1 90 57 50 30 ...(多帧)
DoIP 场景:
诊断仪 --TCP--> DoIP 实体 --CAN/Ethernet--> ECU
逻辑地址:0x0E00(诊断仪) -> 0x0001(ECU)
四、案例与场景:不同车型的协议选型
在乘用车 OBD 诊断中,常见组合是 ISO 14229 + ISO 15765-2 + ISO 11898,即 UDS over CAN。若涉及 OTA 刷写或域控制器大数据读取,则使用 ISO 14229 + ISO 13400 + Ethernet,即 UDS over DoIP。商用车则常见 SAE J1939,通过 PGN 请求 DM1 故障码,同时部分车型也支持 UDS over J1939 或 UDS over CAN。
| 协议 | 主要层次 | 典型承载 | 典型应用 |
|---|---|---|---|
| ISO 14229 (UDS) | 应用层 | CAN / CAN FD / DoIP / K-Line | 乘用车、商用车统一诊断服务 |
| ISO 15765-2 | 传输层 / 网络层 | CAN / CAN FD | DoCAN 分包与流控 |
| ISO 13400 (DoIP) | 传输层 / 网络层 | Ethernet / TCP / UDP | 刷写、大数据、域控诊断 |
| ISO 14230 (KWP2000) | 应用层 / 链路层 | K-Line | 早期车型、部分摩托车 |
| SAE J1939 | 应用层 / 网络层 | CAN 29 位扩展帧 | 商用车、发动机、变速箱 |
五、误区与复盘
误区一:把 UDS 当成完整协议栈。UDS 只定义服务语义,不定义 CAN 分包。没有 ISO 15765 或 ISO 13400,UDS 报文无法在总线上传输。
误区二:认为 DoIP 一定比 DoCAN 快。DoIP 带宽高,但若 ECU 内部处理慢或路由激活失败,诊断响应仍可能超时。需结合 P2/P2* 参数评估。
误区三:混淆 J1939 与 UDS。J1939 有自己的诊断报文 DM1/DM2,不能直接套用 UDS 的 0x19 服务;但部分网关可做协议转换。
复盘建议:拿到一个诊断需求,先问“应用层用 UDS 还是 J1939”,再问“传输层用 DoCAN、DoIP 还是 K-Line”,最后确认“物理层是 CAN、CAN FD 还是 Ethernet”。三层确定后,协议栈组合自然清晰。
掌握协议分层模型后,再看诊断仪配置、ECU 诊断描述文件(ODX/CDD)和总线抓包,就能快速定位问题发生在哪一层:是服务不支持、分包错误、路由未激活,还是物理层无响应。这也是后续学习 UDS 服务、DoIP 路由和 CAN 传输机制的基础。