第2章:UDS协议概述
好,咱们正式开始聊UDS协议。说实话,很多刚入行的朋友一听到「UDS」三个字母,就觉得这是很高深的东西。其实没那么玄乎。UDS的全称是 Unified Diagnostic Services,也就是统一诊断服务,对应的标准是 ISO 14229。
我个人的理解很简单:UDS 就是一套标准化的「汽车对话规则」。你想想看,一辆车里有几十个 ECU(电子控制单元),每个 ECU 都有自己的脾气。如果没有统一规则,修车师傅得学几十种「方言」,那得多痛苦?UDS 就是让所有 ECU 都说同一种「普通话」。
2.1 UDS 协议简介
UDS 定义在 OSI 模型的应用层(第7层)。它不关心底层是 CAN 总线还是 LIN 总线,也不管你用的是 500kbps 还是 250kbps 的波特率。它只规定:诊断仪发什么请求,ECU 应该回什么响应。
举个例子,你想读取发动机 ECU 的故障码。按照 UDS 的规矩,你要发送一个特定的服务 ID(比如 0x19,读取故障码的服务)。ECU 收到后,会按照标准格式回复你。就这么简单。
核心要点:UDS 是「请求-响应」模式。诊断仪是客户端,ECU 是服务器。每次通信,都是诊断仪先发请求,ECU 再回响应。
UDS 定义了 26 种服务,常用的也就十几种。比如:
- 0x10:诊断会话控制(启动诊断会话)
- 0x22:读取数据(读电压、温度等)
- 0x2E:写入数据(写配置参数)
- 0x19:读取故障码
- 0x14:清除故障码
- 0x31:例程控制(执行自检、刷写等)
- 0x34:请求下载(刷写固件的第一步)
每个服务都有固定的报文格式。比如 0x22 服务,请求报文是:0x22 + DID(数据标识符,2字节)。响应报文是:0x62 + DID + 数据。嗯,这里要注意,响应报文的第一个字节是请求服务 ID + 0x40,这是 UDS 的固定规则。
2.2 UDS 在汽车诊断中的应用场景
UDS 的应用场景,说白了就是三个字:查、写、刷。
场景一:产线终检
每辆车下线前,都要做一次全面体检。我记得在某主机厂的项目中,产线终端会用 UDS 的 0x22 服务读取所有 ECU 的软件版本号,用 0x19 服务检查有没有故障码。如果发现某个 ECU 版本不对,直接判定不合格。这比人工检查快多了。
场景二:4S店维修
车坏了,开到 4S 店。技师拿诊断仪插上 OBD 接口,用 UDS 的 0x19 服务读故障码,用 0x22 服务看传感器数据。我曾经遇到过一个案例,客户说发动机故障灯亮,读出来是「氧传感器信号异常」。用 0x2E 服务重新写了一下氧传感器的标定参数,问题就解决了。你看,UDS 不只是查问题,还能修问题。
场景三:OTA 远程升级
这是现在最火的应用。车联网时代,不用去 4S 店,远程就能刷固件。流程是这样的:先用 0x10 服务进入编程会话,然后用 0x34 服务请求下载,接着用 0x36 服务传输数据,最后用 0x37 服务请求退出传输。整个过程,UDS 保证了数据的安全性和完整性。
个人经验:做 OTA 刷写时,最怕刷到一半断电。我建议在 0x31 例程控制服务里加一个「刷写前自检」步骤,先检查电池电压是否足够。电压低于 12V 就直接拒绝刷写,能避免很多砖头车。
场景四:ECU 配置与标定
同一个硬件平台,可能用在低配车和高配车上。用 UDS 的 0x2E 服务,可以在产线上写入不同的配置参数。比如低配车限制某些功能,高配车解锁。我见过一个项目,用 0x2E 服务写一个字节的配置字,就能切换「运动模式」和「经济模式」,非常灵活。
2.3 UDS 与 OBD-II 的区别
这个问题,我几乎每次培训都会被问到。很多人以为 OBD-II 就是 UDS,其实不是。它们俩的关系,我打个比方:
- OBD-II 是「交管局规定的强制体检」—— 只检查排放相关的项目,比如氧传感器、催化器、燃油系统。标准是 ISO 15031。
- UDS 是「医院的全身体检」—— 什么都能查,发动机、变速箱、气囊、空调、门窗…… 标准是 ISO 14229。
具体区别,我列个表:
| 对比项 | OBD-II | UDS |
|---|---|---|
| 标准 | ISO 15031 | ISO 14229 |
| 目的 | 排放相关诊断(法规强制) | 全车诊断(厂家自定义) |
| 服务数量 | 9 种(如 01、02、03...) | 26 种(0x10~0x3E) |
| 报文格式 | 固定长度,简单 | 可变长度,灵活 |
| 安全访问 | 无 | 有(0x27 服务,需要种子密钥) |
| 刷写功能 | 不支持 | 支持(0x34/0x36/0x37) |
| 应用场景 | 年检、尾气检测 | 产线、4S店、OTA |
避坑指南:我曾经见过一个项目,工程师把 OBD-II 的报文格式套用到 UDS 上,结果 ECU 完全不响应。原因很简单:OBD-II 的 CAN ID 是 0x7DF(广播地址),而 UDS 用的是物理寻址(比如 0x7E0 请求,0x7E8 响应)。这两个协议在底层就不一样,千万别混用。
另外,OBD-II 的故障码是 P0xxx、P1xxx 这种标准格式,所有车厂通用。而 UDS 的故障码(DTC)虽然也遵循 SAE J2012 标准,但车厂可以自定义很多私有故障码。比如某个车厂定义了一个「左前门玻璃升降器卡滞」的故障码,OBD-II 里是找不到的。
总结一下:OBD-II 是法规底线,UDS 是功能上限。做量产项目,两个协议都要支持。年检时用 OBD-II,日常诊断和刷写用 UDS。嗯,这就是我多年项目经验的体会。
公众号:蓝海资料掘金营,微信deep3321