UDS 交互式学习指南
Unified Diagnostic Services(ISO 14229)—— 汽车 ECU 统一诊断服务。从总线报文到刷写流程,一次讲透。
1 UDS 是什么
一句话定位:测试仪"单方面操控 ECU"的标准化命令集
定义
UDS 是 ISO 14229-1 定义的应用层诊断协议,规定测试仪(Client/Tester)与 ECU(Server)之间"一问一答"的命令格式。
标准
应用层 ISO 14229-1;CAN 上的传输层 ISO 15765-2(ISO-TP);总线物理层 ISO 11898。
价值
统一命令集:台架标定、产线 EOL(写 VIN/SN)、售后诊断、OTA 刷写,全链路通用一套服务。
本质
普通 CAN 报文是 ECU 之间互通信;UDS 是测试仪读写内部数据、执行自检、刷固件、查故障。
六大类服务全景
① 诊断与通信管理
$10会话 $11复位 $27安全 $28通信 $3E保活 $85DTC开关
② 数据传输
$22按DID读 $2E按DID写 $23/$3D按地址读写内存
③ 存储与上传下载
$14清DTC $19读DTC $34/35/36/37刷写传输
④ 输入输出控制
$2F按ID控制IO(驱动执行器测试)
⑤ 例程控制
$31启动/停止/查询例程(自检、标定、内部程序)
⑥ 故障诊断
$19读DTC信息 $14清除DTC(列表/快照/扩展数据)
① 标定:
10 03 → 27解锁 → 22读 / 2E写 → 3E保活② 故障:
19 02列表 → 19 04快照 → 14清除 → 19 02验证③ 刷写:
10 02 → 27解锁 → 34 → 36×N → 37 → 11复位2 诊断请求的构成与寻址
一条 UDS 请求 = SID + 子功能 + 参数
| 部分 | 长度 | 作用 | 示例 |
|---|---|---|---|
| SID 服务标识 | 1 字节 | 定义核心功能 | 0x10 会话、0x19 读DTC、0x22 读数据 |
| 子功能 Sub-function | 可选 1 字节 | 细化具体操作 | 10 01 默认 / 10 02 编程 / 10 03 扩展 |
| 参数 Parameters | 可选 N 字节 | 传递数据(DID、DTC、地址、长度) | 22 F1 90 读VIN |
物理寻址 vs 功能寻址
| 类型 | 语义 | 典型 ID(11位 / 29位) | 场景 |
|---|---|---|---|
| 物理寻址 | 点对点,只发指定 ECU,它必须响应 | 0x7E0→0x7E8 / 0x18DA F1 01 | 绝大多数诊断操作 |
| 功能寻址 | 广播所有 ECU,通常不响应(避免冲突) | 0x7DF / 0x18DB F1 00 | $3E 保活、广播切会话、$19 全车扫DTC |
3 ISO-TP 传输层(ISO 15765-2)
经典 CAN 一帧最多 8 字节,长报文怎么传?——分帧 + 流控
| 帧类型 | PCI 首字节 | 作用 |
|---|---|---|
| 单帧 SF | 0x0N(N=长度) | ≤7 字节(CAN)/ ≤63 字节(FD)直接发 |
| 首帧 FF | 0x1N(12位总长度) | 声明总长度并带首批数据,最多 4095 字节 |
| 连续帧 CF | 0x2N(序列号 0~F) | 后续数据分块,序列号递增 |
| 流控帧 FC | 0x3N(0发/1等/2溢出) | 接收方放行控制:30 继续发送、31 等待、32 溢出 |
←→ECU(发送方)
10 1E 62 F1 90
ECU → Tester:声明总长 30 字节(0x1E)
30 08 14
Tester → ECU:允许发送,BS=8、STmin=20ms
21 xx xx xx xx xx xx 22 … 23 …
ECU → Tester:每帧 7 字节,序列号递增
62 F1 90 + 27 字节 VIN
Tester 按序列号重组出完整响应
4 诊断会话与定时($10)
会话 = ECU 的运行模式,决定开放哪些服务与权限
| 会话 | 子功能 | 开放能力 | 典型场景 |
|---|---|---|---|
| 默认会话 | 10 01 | 只读基础信息($22 部分 DID、$19) | 上电默认 |
| 编程会话 | 10 02 | 刷写服务($34/$36/$37、$11) | EOL / OTA / 售后刷写 |
| 扩展会话 | 10 03 | $27、$2E、$31、$2F 等高权限操作 | 台架标定、产线配置 |
定时参数
| 参数 | 默认值 | 含义 |
|---|---|---|
| P2 | ≤ 50 ms | ECU 响应时间上限(server) |
| P2* | ≤ 5000 ms | 超过 P2 先回 7F xx 78,最终在 P2* 内完成 |
| S3 | 默认 5 s | 会话超时:无请求自动回默认会话 |
| P3 | 默认 5000 ms | Client 等待响应超时上限 |
3E 00(间隔 < S3),防止会话退出。这是 $3E 叫"心跳"的原因。5 响应机制与 NRC
正响应 = SID + 0x40;负响应 = 7F + SID + NRC
| 类型 | 格式 | 示例 |
|---|---|---|
| 请求 | SID + 子功能/参数 | 22 F1 90(读VIN) |
| 正响应 | (SID+0x40) + 数据 | 62 F1 90 ... |
| 负响应 | 7F + SID + NRC | 7F 27 33(安全访问被拒) |
| NRC | 含义 | NRC | 含义 |
|---|---|---|---|
| 0x00 | 未使用 | 0x78 | 收到请求,延迟响应(先"拖住",稍后补真响应) |
| 0x01–0x0F | 保留 | 0x79–0x7D | 保留 |
| 0x10 | 一般拒绝(服务被拒绝) | 0x7E | 当前会话下子功能不支持 |
| 0x11 | 不支持该服务请求 | 0x7F | 当前会话下服务不支持 |
| 0x12 | 不支持子功能 | 0x80 | 保留 |
| 0x13 | 消息长度或格式错误 | 0x81 | RPM 转速太高 |
| 0x14 | 请求信息长度超出 | 0x82 | RPM 转速太低 |
| 0x15–0x20 | 保留 | 0x83 | 引擎正在运行 |
| 0x21 | 服务端正忙 | 0x84 | 引擎未运行 |
| 0x22 | 条件不满足(会话/前置条件不对) | 0x85 | 引擎运行时间太短 |
| 0x23 | 保留 | 0x86 | 温度过高 |
| 0x24 | 请求顺序错误 | 0x87 | 温度过低 |
| 0x25 | 已接收但未执行 | 0x88 | 车速过高 |
| 0x26 | 失败操作阻止当前操作执行 | 0x89 | 车速过低 |
| 0x27–0x30 | 保留 | 0x8A | 油门/踏板过高 |
| 0x31 | 参数错误(请求超出范围) | 0x8B | 油门/踏板过低 |
| 0x32 | 保留 | 0x8C | 变速器档位不在空档 |
| 0x33 | 安全校验未通过(未解锁) | 0x8D | 变速器档位不在排挡 |
| 0x34 | 认证失败(ISO 14229-1:2020 新增) | 0x8E | 保留 |
| 0x35 | 密钥不匹配 | 0x8F | 制动开关未关闭 |
| 0x36 | 解锁错误次数超限(锁定) | 0x90 | 换挡杆不在驻车档 |
| 0x37 | 超时时间未到(冷却中) | 0x91 | 变矩器离合器锁定 |
| 0x38–0x4F | 保留(扩展数据链路安全性) | 0x92 | 电压过高 |
| 0x50–0x6F | 保留 | 0x93 | 电压过低 |
| 0x70 | 不允许上传下载 | 0x94–0xEF | 保留(特定条件下) |
| 0x71 | 数据传输中断 | 0xF0–0xFE | 汽车制造商保留(OEM 自定义) |
| 0x72 | 擦除/烧写内存错误(刷写失败) | 0xFF | 保留 |
| 0x73 | 块序列计数错误($36 跳号) | 0x74–0x77 | 2020 版新增:0x74 地址/数据非法、0x75 字节序错、0x76 数据包格式错、0x77 加密校验失败(旧版标保留) |
7F xx 78,脚本必须继续等待后续真实响应,不能把 78 当最终结果。6 核心服务逐个详解
结合真实报文示例,六个大类一次讲清
6.1 $10 会话控制 · $11 ECU复位
10 02 请求 → 正响应 50 02 00 32 01 F4(后 4 字节是当前会话的 P2/P2*,工具应动态读取)。$11:11 01 硬复位 / 11 03 软复位,复位后回默认会话。
6.2 $22 读DID · $2E 写DID(数据传输类)
请求:22 F1 90 // 读VIN
响应:62 F1 90 4C 4D 38 43 37 ... // 17字节ASCII
请求:2E F1 91 41 42 43 31 32 33 // 写SN="ABC123"
响应:6E F1 91
| DID | 含义 | DID | 含义 |
|---|---|---|---|
F190 | VIN 车架号(17字节,通常只写一次) | F187 | 软件版本号 |
F191 | ECU 序列号 SN | F186 | 硬件版本号 |
F195 | 控制器软件版本号 | F193 | 硬件号 |
F1A5 | 主引导加载软件部件号 | F1AC | ECU软件结构零件号 |
D134 | Car Mode 车辆模式 | DD0A | UsageMode 车辆状态 |
10 03 + 27 解锁(否则 NRC 0x33);② 长度必须与 DID 定义严格一致(否则 0x13);③ VIN/SN 通常一次性写入,写后锁死。刷固件不是 $2E!是 $34/$36/$37。6.3 $19 读DTC · $14 清DTC(故障诊断类)
| 子功能 | 名称 | 请求格式 | 返回 |
|---|---|---|---|
| 01 | reportNumberOfDTCByStatusMask | 19 01 + 掩码(1B) | DTC 数量 |
| 02 | reportDTCByStatusMask | 19 02 + 掩码(1B) | DTC 列表(每条 3字节DTC+1字节状态) |
| 04 | reportDTCSnapshotRecordByDTCNumber | 19 04 + DTC(3B) | 指定 DTC 的快照(冻结帧) |
| 06 | reportDTCExtDataRecordByDTCNumber | 19 06 + DTC(3B) | 指定 DTC 的扩展数据(计数器等) |
| 07 | reportSupportedDTC | 19 07 | ECU 支持的全部 DTC |
清除:14 FF FF FF → 正响应 54。清完必须 19 02 FF 回读验证。
0x09 激活+亮灯 · 0xFF 全部 · 0x0A 待确认+已确认6.4 $2F 输入输出控制 · $31 例程控制
$2F:按 DID 控制输入输出,模拟执行器信号——例如 EOL 时不遥控车窗,用 2F 直接模拟升降信号验证执行器。
$31:把 ECU 内部预置程序按例程编号启停:
31 01 01 02 // 启动例程 0x0102(如风扇测试)
71 01 01 02 00 05 // 成功,状态00(通过),耗时5ms
31 02 01 02 // 停止例程
31 03 01 02 // 查询例程结果
31 03 或观察实际现象——这就是"报文 OK 但设备没反应"的原因。7 安全访问 $27 Seed & Key
高权限操作(写标定/刷固件/特殊例程)前必须先证明你有权限
27 01
Tester → ECU
67 01 + A1 CE 1A 01
ECU → Tester
算法(DLL)→ Key = 70 D5 53 05
Tester 内部:厂商 Seed→Key 算法,无通用公式
27 02 + 70 D5 53 05
Tester → ECU
67 02 解锁成功
ECU → Tester;Key 错则回 7F 27 35
| 规则 | 说明 |
|---|---|
| 安全等级 | 27 01/02 = 级别1,03/04 = 级别2…奇数请求Seed、偶数发Key |
| 算法私有 | Seed→Key 算法厂商定义(AES/XOR/查表/自定义),没有通用公式,来自厂商诊断规范或算法 DLL |
| 工具接入 | CANoe / 周立功加载 Seed&Key DLL:收到 Seed 自动算 Key 自动发 $27 02 |
| 次数限制 | 连续错 Key → NRC 0x36 锁定 → 等待冷却(0x37) |
| 前置条件 | 多数 ECU 要求先切扩展/编程会话才允许 $27,否则 NRC 0x22 |
extern "C" 防止函数名被修饰;字节长度与 ECU 规范一致。8 DTC 结构、状态位与故障排查
从 3 字节 DTC 到状态位解析,看懂一条故障码
8.1 DTC 3 字节结构
| 字节 | 内容 | 说明 |
|---|---|---|
| Byte1-2 | DTC 编号 | 前 2 字节(基于 ISO 15031-6 或厂商定义),如 EE0C |
| Byte3 | 故障类型 | 0x00 未定义;0x01~0x0F 常规类型:0x04 超上限、0x05 低于下限、0x0B 对地短路、0x0C 对电源短路、0x0D 开路等 |
示例解析:EE 0C 68 → DTC=EE0C(ECU 电源电压 B 过低)+ 类型 68(基于算法的故障-事件信息)。
8.2 DTC 状态位(StatusOfDTC)
| Bit | 掩码 | 名称 | 含义 |
|---|---|---|---|
| 0 | 0x01 | testFailed | 当前测试失败(故障激活,通常点亮 MIL) |
| 1 | 0x02 | testFailedThisOperationCycle | 本驾驶循环内测试曾失败 |
| 2 | 0x04 | pendingDTC | 待定故障(首次检测到,未确认) |
| 3 | 0x08 | confirmedDTC | 已确认故障(多次循环验证,存非易失存储) |
| 4 | 0x10 | testNotCompletedSinceLastClear | 自上次清除后测试未完成 |
| 5 | 0x20 | testFailedSinceLastClear | 自上次清除后失败过(历史标记) |
| 6 | 0x40 | testNotCompletedThisOperationCycle | 本循环测试未完成 |
| 7 | 0x80 | warningIndicatorRequested | 请求点亮警告灯 |
98 07 13 27,最后字节 0x27 = 0010 0111,bit0=1 → 当前故障。8.3 标准故障排查流程
1 10 03 // 进入扩展会话
2 19 02 09 // 读当前激活故障(掩码09 = 激活+亮灯)
3 14 FF FF FF // 清除所有故障码
4 19 02 FF // 回读验证已清除
19 02 读故障 → 对照诊断调查表(DTC 页)核对原因 → 无影响则清除 → 刷机/路试 → 完成后再读一次确认无新故障。故障注入测试 = 人为制造故障(拔保险、拔插头、拔电源)验证 ECU 能否正确报码。9 ECU 刷写流程($34/$36/$37)
产线 EOL、OTA、售后升级的底层逻辑:协商 → 分块传 → 退出 → 复位
9.1 三个核心服务
| SID | 名称 | 作用 | 请求示例 |
|---|---|---|---|
| $34 | RequestDownload | 协商:告诉 ECU 写哪、写多少;ECU 回最大块长 | 34 00 44 00 80 00 00 04 00 |
| $36 | TransferData | 分块发送数据,块号递增 | 36 01 11 22 33 ... |
| $37 | RequestTransferExit | 结束传输,ECU 校验存储 | 37 |
9.2 传输长度约束
| 场景 | 有效数据 | 说明 |
|---|---|---|
| 单帧 SF | ≤ 6 字节 | CAN 8 字节 − SID 1 − 计数 1 |
| 多帧 FF+CF | ≤ 4095 字节 | ISO-TP 12 位长度上限 |
| 单次 $36 | ≤ (MaxBlockLength − 2) | 由 $34 响应协商,如 20→18 字节 |
10 工具实操与面试考点
周立功 / CANoe 台架流程 + 高频面试题
10.1 台架标准操作(ZCANPRO 示例)
- 硬件:USBCAN 接诊断 CAN,终端电阻匹配,波特率对齐
- 新建 UDS 工程:配置请求/响应 ID、P2/P2*、ISO-TP 参数
10 03进扩展会话 →50 03 00 32 01 F427 01取 Seed → DLL 自动算 Key 自动发27 02→67 02解锁成功22 F1 90读 VIN、22 F1 87读版本;2E F1 91 + SN写序列号(EOL)19 02 FF读 DTC →19 04 + DTC读快照 →14 FF FF FF清码31 01 81 02启动例程(如 IVI USB 切换)→31 03 81 02查结果- 全程抓 Trace:原始 CAN 帧 + ISO-TP 解析,定位"没响应 / 流控错 / NRC 拒绝"
10.2 面试高频考点
概念类
UDS 标准?ISO 14229-1。
正响应怎么算?SID+0x40。
ISO-TP 四帧?SF/FF/CF/FC。
P2/P2*/S3?响应时限/延迟上限/会话超时。
服务类
$22 vs $2E?读/写DID。
$19 的 01/02/04?数量/列表/快照。
$27 流程?Seed→Key→校验。
刷写三件套?$34→$36×N→$37。
排错类
0x13 长度错 / 0x22 会话不对 / 0x33 未解锁 / 0x31 参数越界 / 0x78 延迟响应。无响应先查接线、ID、波特率、功能寻址不回包。
· ISO 15765-2 DoCAN — Transport protocol and network layer services (ISO-TP)
· ISO 15765-3 UDS on CAN 实现规范
· 论文:Assawinjaipetch et al., Unified Diagnostic Services Protocol Implementation in an ECU, ICICTES 2014
· 论文:Krishnamurthy, Unified Diagnostic Services (UDS) in Automotive: A technical Study, EJAET 2021
· 论文:罗峰、郁静华《汽车统一诊断服务诊断协议栈网络层测试方法》, 同济大学学报 2016
· 论文:陈博文、裴晓飞《基于UDS协议的EHB系统故障诊断服务研究》, 武汉理工大学学报
· 论文:马宏伟、吴长水《基于统一诊断协议的控制器在线升级系统设计》, 软件工程 2020
· 网络教程:CSDN《汽车诊断 UDS 协议全解:从基础到服务实战》等公开资料