车载测试学习指南
已学 0/0 ✎ 自测
UDS 交互式指南 · 第 11 个整合单元

UDS 交互式学习指南

Unified Diagnostic Services(ISO 14229)—— 汽车 ECU 统一诊断服务。从总线报文到刷写流程,一次讲透。

ISO 14229-1ISO 15765-2 / ISO-TPCAN / CAN FD六大类服务DTC刷写CANoe / ZCANPRO

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 0327解锁 → 22读 / 2E写 → 3E保活
② 故障:19 02列表 → 19 04快照 → 14清除 → 19 02验证
③ 刷写:10 0227解锁 → 3436×N3711复位

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
应答地址:ECU 回复时会带上自己的地址,告诉用户"是谁回的"。

3 ISO-TP 传输层(ISO 15765-2)

经典 CAN 一帧最多 8 字节,长报文怎么传?——分帧 + 流控

帧类型PCI 首字节作用
单帧 SF0x0N(N=长度)≤7 字节(CAN)/ ≤63 字节(FD)直接发
首帧 FF0x1N(12位总长度)声明总长度并带首批数据,最多 4095 字节
连续帧 CF0x2N(序列号 0~F)后续数据分块,序列号递增
流控帧 FC0x3N(0发/1等/2溢出)接收方放行控制:30 继续发送、31 等待、32 溢出
多帧传输完整时序(ECU 返回长响应 → Tester)
Tester(接收方)←→ECU(发送方)
① FF 首帧10 1E 62 F1 90 ECU → Tester:声明总长 30 字节(0x1E)
② FC 流控30 08 14 Tester → ECU:允许发送,BS=8、STmin=20ms
③ CF 连续帧21 xx xx xx xx xx xx 22 … 23 … ECU → Tester:每帧 7 字节,序列号递增
④ 重组62 F1 90 + 27 字节 VIN Tester 按序列号重组出完整响应
顺序固定:FF 声明总长 → FC 定节奏(BS/STmin)→ CF 按序列号递增发送。单帧 CAN 最多 8 字节,超过就拆成多帧。
面试点:BS 与 STmin —— 接收方在流控帧里指定:BS(BlockSize)允许连续发几个 CF;STmin(最小间隔)连续帧之间的最小时间(ms)。

4 诊断会话与定时($10)

会话 = ECU 的运行模式,决定开放哪些服务与权限

会话子功能开放能力典型场景
默认会话10 01只读基础信息($22 部分 DID、$19)上电默认
编程会话10 02刷写服务($34/$36/$37、$11)EOL / OTA / 售后刷写
扩展会话10 03$27、$2E、$31、$2F 等高权限操作台架标定、产线配置
会话状态机(三态切换)
默认会话模式 (0x01) 上电进入 · 只读 编程会话模式 (0x02) 刷写 拓展会话模式 (0x03) 标定 · 读写 $10 03 $10 03 $10 01/复位 $10 01/复位 $10 02
默认↔扩展双向切($10 03);扩展→编程用 $10 02;编程/扩展回默认用 $10 01 / 复位 / 超时 S3。注:ISO 14229-1 标准允许默认直切编程($10 02),但多数 ECU 刷写流程要求先扩展再编程,故本图按受限口径绘制。

定时参数

参数默认值含义
P2≤ 50 msECU 响应时间上限(server)
P2*≤ 5000 ms超过 P2 先回 7F xx 78,最终在 P2* 内完成
S3默认 5 s会话超时:无请求自动回默认会话
P3默认 5000 msClient 等待响应超时上限
保活:长流程(刷写)中周期发 3E 00(间隔 < S3),防止会话退出。这是 $3E 叫"心跳"的原因。

5 响应机制与 NRC

正响应 = SID + 0x40;负响应 = 7F + SID + NRC

类型格式示例
请求SID + 子功能/参数22 F1 90(读VIN)
正响应(SID+0x40) + 数据62 F1 90 ...
负响应7F + SID + NRC7F 27 33(安全访问被拒)
NRC 全表(ISO 14229-1) 高频用红色标注
NRC含义NRC含义
0x00未使用0x78收到请求,延迟响应(先"拖住",稍后补真响应)
0x01–0x0F保留0x79–0x7D保留
0x10一般拒绝(服务被拒绝)0x7E当前会话下子功能不支持
0x11不支持该服务请求0x7F当前会话下服务不支持
0x12不支持子功能0x80保留
0x13消息长度或格式错误0x81RPM 转速太高
0x14请求信息长度超出0x82RPM 转速太低
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–0x772020 版新增:0x74 地址/数据非法、0x75 字节序错、0x76 数据包格式错、0x77 加密校验失败(旧版标保留)
0x78 陷阱:ECU 处理超 P2 时会先回 7F xx 78,脚本必须继续等待后续真实响应,不能把 78 当最终结果。
高频排查记忆:0x13 长度错 → 0x22 会话/条件不对 → 0x31 参数越界 → 0x33 没解锁 → 0x35/36/37 安全链路问题 → 0x7E/7F 当前会话不支持该服务/子功能 → 0x70–0x73 刷写链路问题。0x80–0x93 是车辆状态类 NRC(转速/温度/车速/电压/档位),多为 $31 例程、$2F IO 控制的执行前提校验失败。

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含义
F190VIN 车架号(17字节,通常只写一次)F187软件版本号
F191ECU 序列号 SNF186硬件版本号
F195控制器软件版本号F193硬件号
F1A5主引导加载软件部件号F1ACECU软件结构零件号
D134Car Mode 车辆模式DD0AUsageMode 车辆状态
写 DID 三坑:① 需先 10 03 + 27 解锁(否则 NRC 0x33);② 长度必须与 DID 定义严格一致(否则 0x13);③ VIN/SN 通常一次性写入,写后锁死。刷固件不是 $2E!是 $34/$36/$37。

6.3 $19 读DTC · $14 清DTC(故障诊断类)

子功能名称请求格式返回
01reportNumberOfDTCByStatusMask19 01 + 掩码(1B)DTC 数量
02reportDTCByStatusMask19 02 + 掩码(1B)DTC 列表(每条 3字节DTC+1字节状态)
04reportDTCSnapshotRecordByDTCNumber19 04 + DTC(3B)指定 DTC 的快照(冻结帧)
06reportDTCExtDataRecordByDTCNumber19 06 + DTC(3B)指定 DTC 的扩展数据(计数器等)
07reportSupportedDTC19 07ECU 支持的全部 DTC

清除:14 FF FF FF → 正响应 54。清完必须 19 02 FF 回读验证。

DTC 状态掩码计算器(点击 bit 组合 → 得到掩码)
当前掩码:0x00 常用参考: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 的正响应 71 只代表"ECU 接收并启动例程",不代表执行成功、更不代表外设动作完成。判断结果必须用 31 03 或观察实际现象——这就是"报文 OK 但设备没反应"的原因。

7 安全访问 $27 Seed & Key

高权限操作(写标定/刷固件/特殊例程)前必须先证明你有权限

Seed & Key 完整时序(静态)
① 请求 Seed27 01 Tester → ECU
② 返回 Seed67 01 + A1 CE 1A 01 ECU → Tester
③ 内部计算算法(DLL)→ Key = 70 D5 53 05 Tester 内部:厂商 Seed→Key 算法,无通用公式
④ 发送 Key27 02 + 70 D5 53 05 Tester → ECU
⑤ 校验通过67 02 解锁成功 ECU → Tester;Key 错则回 7F 27 35
解锁后才能执行 $2E / $31 / $34 等高权限服务;连续错 Key 会触发 NRC 0x36 锁定。
规则说明
安全等级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
DLL 要点:位数与工具匹配(32位工具配32位DLL);C++ 必须 extern "C" 防止函数名被修饰;字节长度与 ECU 规范一致。

8 DTC 结构、状态位与故障排查

从 3 字节 DTC 到状态位解析,看懂一条故障码

8.1 DTC 3 字节结构

字节内容说明
Byte1-2DTC 编号前 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掩码名称含义
00x01testFailed当前测试失败(故障激活,通常点亮 MIL)
10x02testFailedThisOperationCycle本驾驶循环内测试曾失败
20x04pendingDTC待定故障(首次检测到,未确认)
30x08confirmedDTC已确认故障(多次循环验证,存非易失存储)
40x10testNotCompletedSinceLastClear自上次清除后测试未完成
50x20testFailedSinceLastClear自上次清除后失败过(历史标记)
60x40testNotCompletedThisOperationCycle本循环测试未完成
70x80warningIndicatorRequested请求点亮警告灯
区分当前/历史故障:把状态字节转二进制,bit0(0x01)为 1 就是当前激活故障;为 0 是历史故障。例: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、售后升级的底层逻辑:协商 → 分块传 → 退出 → 复位

刷写八步走(进度动画)
① 10 02进入编程会话
② 27 解锁Seed&Key
③ 85 02关DTC记录
④ 28 03关通信(可选)
⑤ 34请求下载
⑥ 36×N分块传输
⑦ 37退出传输
⑧ 10 01→11 01复位
点击播放,观察刷写完整时序。注意 $36 块序列号从 01 递增,跳号会 NRC 0x73。

9.1 三个核心服务

SID名称作用请求示例
$34RequestDownload协商:告诉 ECU 写哪、写多少;ECU 回最大块长34 00 44 00 80 00 00 04 00
$36TransferData分块发送数据,块号递增36 01 11 22 33 ...
$37RequestTransferExit结束传输,ECU 校验存储37

9.2 传输长度约束

场景有效数据说明
单帧 SF≤ 6 字节CAN 8 字节 − SID 1 − 计数 1
多帧 FF+CF≤ 4095 字节ISO-TP 12 位长度上限
单次 $36≤ (MaxBlockLength − 2)由 $34 响应协商,如 20→18 字节
刷写失败高频 NRC:0x33 没解锁 / 0x31 地址越界 / 0x73 块号跳变 / 0x72 Flash 写入失败(供电不稳、文件损坏)。中途断连必须从头重跑,不能续传。

10 工具实操与面试考点

周立功 / CANoe 台架流程 + 高频面试题

10.1 台架标准操作(ZCANPRO 示例)

  1. 硬件:USBCAN 接诊断 CAN,终端电阻匹配,波特率对齐
  2. 新建 UDS 工程:配置请求/响应 ID、P2/P2*、ISO-TP 参数
  3. 10 03 进扩展会话 → 50 03 00 32 01 F4
  4. 27 01 取 Seed → DLL 自动算 Key 自动发 27 0267 02 解锁成功
  5. 22 F1 90 读 VIN、22 F1 87 读版本;2E F1 91 + SN 写序列号(EOL)
  6. 19 02 FF 读 DTC → 19 04 + DTC 读快照 → 14 FF FF FF 清码
  7. 31 01 81 02 启动例程(如 IVI USB 切换)→ 31 03 81 02 查结果
  8. 全程抓 Trace:原始 CAN 帧 + ISO-TP 解析,定位"没响应 / 流控错 / NRC 拒绝"
CANoe 要点:用诊断树服务执行(自动套用参数、触发 Security DLL),不要用 Raw 手动发——Raw 不触发 DLL 自动算 Key。

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 14229-1:2020/2026 Road vehicles — Unified diagnostic services (UDS) — Part 1: Application layer
· 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 协议全解:从基础到服务实战》等公开资料
本指南为学习资料,具体 ECU 的 DID/DTC/例程/安全算法以厂商诊断规范为准。