第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