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 字节数据;最后物理层以差分电平发送到总线。接收端反向重组,最终把正响应交给应用层解析。

诊断协议栈的核心价值:让诊断仪与 ECU 在“服务语义”上统一,同时允许底层承载从经典 CAN、CAN FD、DoIP 到 K-Line、J1939 灵活替换。

二、主要协议定位与关系

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 在乘用车上的定位不同。

诊断协议栈分层与典型协议映射 应用层统一语义,传输层与网络层按承载方式替换 应用层 / 诊断服务层 ISO 14229 (UDS):0x10 会话、0x27 安全、0x22 读数据、0x2E 写数据、0x19 读DTC、0x31 例程 SAE J1939 应用层 PGN / SPN / DM1 传输层 / 网络层 ISO 15765-2 (DoCAN):单帧/首帧/连续帧/流控帧;ISO 13400 (DoIP):TCP/UDP 诊断路由 ISO 14230 K-Line 报文 数据链路层 / 物理层 CAN / CAN FD (ISO 11898)、Ethernet (100/1000BASE-T1)、K-Line、J1939 物理层 29 位扩展帧 J1939 链路 乘用车主流组合 UDS + DoCAN ISO 14229 + ISO 15765 经典 CAN / CAN FD 以太网高带宽组合 UDS + DoIP ISO 14229 + ISO 13400 刷写 / 大数据诊断 商用车 / 早期车型 J1939 / KWP2000 SAE J1939 / ISO 14230 29 位 CAN / K-Line

三、方法流程:一次诊断请求的栈内旅程

以“读取 VIN(DID 0xF190)”为例,诊断仪发出请求后,协议栈按以下顺序工作:

  1. 应用层构造 UDS 请求:22 F1 90。
  2. 传输层判断长度,若为经典 CAN 且数据不超过 7 字节,使用单帧;否则拆为首帧与连续帧。
  3. 网络层加上寻址信息,如功能寻址 0x7DF 或物理寻址 0x7E0。
  4. 数据链路层封装为 CAN 帧,物理层发送到总线。
  5. ECU 接收后逐层解包,应用层执行服务并返回 62 F1 90 ...。
  6. 诊断仪重组响应,应用层解析 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 传输机制的基础。