1 诊断的定义

在汽车电子系统中,诊断(Diagnostics) 是车辆 ECU(Electronic Control Unit, 电子控制单元)与外部诊断仪或测试工具之间的通信协议。通过诊断,工程师或维修人员可以:

  • 读取 ECU 内部的数据(如 VIN、软件版本、传感器状态等)。

  • 写入或修改配置参数(如标定数据、变更配置)。

  • 执行特定功能(如复位、清除故障码、进入编程模式)。

  • 下载/升级 ECU 软件。

  • 进行安全访问和功能测试。

目前最广泛使用的诊断协议是 UDS(Unified Diagnostic Services, ISO-14229),它继承并扩展了早期的 KWP2000 和 OBD-II 标准。

2 UDS 的基本分层

UDS 是一个应用层协议,常见的实现基于 CAN 总线。为了保证诊断报文可以在 CAN 的 8 字节限制下传输,它通常依赖 ISO-TP(ISO-15765-2)作为传输层。整体分层结构如下:

  • 物理层(CAN 总线):提供基础通信,典型报文包含 CAN ID 和数据段(最多 8 字节)。

  • 传输层(ISO-TP):解决报文分段和组装问题。

    • Single Frame (SF):单帧,UDS 报文 ≤ 7 字节。

    • First Frame (FF):首帧,UDS 报文 > 7 字节时使用。

    • Consecutive Frame (CF):后续帧,用于长报文继续传输。

    • Flow Control (FC):流控帧,用于协调接收端和发送端的节奏。

  • 应用层(UDS 服务):真正的诊断功能,由服务号 (SID) 和参数组成。

👉 解读报文时要区分这三层:CAN ID → ISO-TP PCI → UDS 服务。

3. 报文示例解析

3.1 读取数据标识符

请求:03 22 F1 90

  • 03 = PCI,表示后续 UDS 长度 = 3 字节。

  • 22 = 读数据服务(ReadDataByIdentifier)。

  • F1 90 = DID(例如 VIN 的一部分)。

响应:07 62 F1 90 56 49 4E 31

  • 07 = PCI,UDS 长度 = 7 字节。

  • 62 = 正响应(0x22 + 0x40)。

  • F1 90 = 回显 DID。

  • 56 49 4E 31 = 数据内容(ASCII “VIN1”)。

3.2 写入数据标识符

请求:04 2E C0 12 AB

  • 04 = PCI,UDS 长度 = 4 字节。

  • 2E = 写数据服务(WriteDataByIdentifier)。

  • C0 12 = DID。

  • AB = 要写入的值。

响应:03 6E C0 12

  • 03 = PCI,UDS 长度 = 3。

  • 6E = 正响应(0x2E + 0x40)。

  • C0 12 = 回显 DID。

3.3 进入诊断会话

请求:02 10 03

  • 02 = PCI,长度 2。

  • 10 = DiagnosticSessionControl 服务。

  • 03 = Programming Session。

响应:02 50 03

  • 50 = 正响应(0x10 + 0x40)。

  • 03 = 已进入编程会话。

4. 常见 UDS 服务速查表

服务 ID (SID)

名称

描述

0x10

Diagnostic Session Control

切换 ECU 的诊断会话,例如默认、扩展、编程模式

0x11

ECU Reset

重置 ECU(硬件/软件/关键字复位)

0x14

Clear Diagnostic Information

清除故障码(DTCs)

0x19

Read DTC Information

读取故障码信息

0x22

ReadDataByIdentifier

读取 ECU 内部数据(通过 DID)

0x23

ReadMemoryByAddress

按地址读取内存内容

0x27

Security Access

安全访问,常用于解锁写操作或编程功能

0x28

Communication Control

控制 ECU 通信模式(如静音、开启)

0x2E

WriteDataByIdentifier

写入 ECU 数据(通过 DID)

0x31

Routine Control

执行 ECU 内部例行任务(如刷写校验、触发功能)

0x34

Request Download

请求下载数据(常用于 ECU 刷写)

0x36

Transfer Data

传输数据块

0x37

Request Transfer Exit

下载完成退出

0x3E

Tester Present

保持会话活跃,防止超时退出

0x85

Control DTC Setting

打开/关闭故障码记录功能

👉 正响应规则:请求 SID + 0x40,例如 0x22 → 0x62。

👉 负响应格式:7F <请求SID> <NRC>,其中 NRC = Negative Response Code,表示拒绝原因(如条件不满足、安全访问失败、服务不支持)。

5. 诊断的应用场景

  • 研发阶段:工程师用诊断命令读取 ECU 状态,验证功能,修改参数。

  • 生产阶段:工厂下线检测,写入配置,标定 ECU。

  • 售后阶段:维修技师通过诊断读取故障码、清除 DTC、升级 ECU 软件。

  • 安全管理:通过 Security Access 限制敏感操作,避免未授权写入或刷写。

6. 总结

  • UDS 是车载 ECU 与外部工具通信的标准协议,核心是 服务号 (SID) + 参数。

  • 在 CAN 总线上,UDS 报文通常会被 ISO-TP 封装,第一个字节往往是 PCI(报文长度或帧类型),而不是服务号本身。

  • 报文解析的基本思路是:CAN ID → ISO-TP → UDS 服务 (SID + 参数)。

  • DID(Data Identifier)由 OEM 定义,需要查 ECU 的 DID 映射表才能知道具体含义。

  • 掌握常见服务和响应规则后,就能快速理解大部分诊断交互。