UDS 诊断入门:如何读懂诊断报文
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 服务速查表
👉 正响应规则:请求 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 映射表才能知道具体含义。
掌握常见服务和响应规则后,就能快速理解大部分诊断交互。
本文为原创内容,遵循 CC BY-NC-ND 4.0 协议。转载请注明来源 kixyu,禁止商业使用及修改演绎。