Tip📌:spr存在的目的是告诉ECU针对某个服务请求是否需要发送正响应数据,用于减少ECU发送不必要的响应,节约系统资源:
- spr=1, 抑制正响应,即ECU不给出正响应;
- spr=0, 需要ECU给出正响应,如果某个服务没有sub-function,即没有第二个字节,那默认是要发正响应的。
2.3 正响应/负响应(Positive/Negative Response)
诊断工具向车辆发送服务请求后,如果服务执行成功,则返回的响应消息称为正响应,反之返回的响应消息称为负响应。
2.3.1 正响应报文格式
正响应报文的字节组成格式如下所示:

——举个最简单的例子(0x10-诊断会话控制服务):
——再举个不带sub-function的例子(0x22-通过DID读数据):
2.3.2 负响应报文格式
负响应消息由两部分组成:SID和负响应码(NRC)。SID用于标识响应的服务,负响应码指示服务执行失败的原因。
负响应报文的字节组成格式如下所示:

——还是拿0x10-诊断会话控制服务来举例:
2.4 负响应码(Negative Response Code - NRC)
在UDS协议中,负响应码用于指示服务执行失败的原因。NRC用一个字节表示,每个取值都对应一种不同的错误类型。
| NRC码 | 含义 | NRC码 | 含义 |
|---|---|---|---|
| 0x01 - 0x0f | 暂保留; | 0x78 | 收到请求,延迟响应; |
| 0x10 | 未知错误,服务被拒绝; | 0x79 - 0x7d | 暂保留; |
| 0x11 | 不支持该服务请求; | 0x7e | 当前会话下子功能不支持; |
| 0x12 | 不支持子功能; | 0x7f | 当前会话下服务不支持; |
| 0x13 | 消息长度或格式错误; | 0x80 | 暂保留; |
| 0x14 | 请求信息长度超出; | 0x81 | rpm(每分钟转速)太高; |
| 0x15 - 0x20 | 暂保留; | 0x82 | rpm太低; |
| 0x21 | 服务端正忙; | 0x83 | 当前引擎正在运行; |
| 0x22 | 条件不满足; | 0x84 | 当前引擎未运行; |
| 0x23 | 暂保留; | 0x85 | 截止当前时间引擎运行时间太短; |
| 0x24 | 请求顺序错误; | 0x86 | 温度过高; |
| 0x25 | 指令已经被接收,但是未被执行; | 0x87 | 温度过低; |
| 0x26 | 失败的操作导致当前操作无法执行; | 0x88 | 车速过高; |
| 0x27 - 0x30 | 暂保留; | 0x89 | 车速过低; |
| 0x31 | 参数错误; | 0x8a | 油门/踏板过高(超过了当前要求的最大阈值); |
| 0x32 | 暂保留; | 0x8b | 油门/踏板过低; |
| 0x33 | 安全校验未通过; | 0x8c | 变速器档位不在空档; |
| 0x34 | 暂保留; | 0x8d | 变速器档位不在排挡; |
| 0x35 | 密钥不匹配; | 0x8e | 暂保留; |
| 0x36 | 已达到解锁最大错误次数; | 0x8f | 制动开关没有关闭 |
| 0x37 | 超时时间未到; | 0x90 | 换挡杆不在驻车档; |
| 0x38 - 0x4f | 由扩展数据链路安全性保留; | 0x91 | 变矩器离合器锁定; |
| 0x50 - 0x6f | 暂保留; | 0x92 | 电压过高; |
| 0x70 | 不允许上传下载; | 0x93 | 电压过低; |
| 0x71 | 数据传输中断; | 0x94 - 0xef | 暂保留(特定条件下); |
| 0x72 | 擦除或烧写内存错误; | 0xf0 - 0xfe | 为汽车制造商保留; |
| 0x73 | 块序列计数错误; | 0xff | 暂保留; |
| 0x74 - 0x77 | 暂保留; |
以上内容是对UDS协议及一些入门基础知识的阐述,在接下来的篇章中,将详细介绍UDS协议中定义的全部26种服务。每一种服务都将被仔细解析和阐述,以便大家能够全面理解其功能和用法。各篇章还将通过图示方式给出直观的通信示例,帮助大家更好地理解UDS协议的实际应用。
三、UDS服务详述
Tip📌:各表格中标黄的为常用服务!!!
3.1 诊断和通信管理类
诊断和通信管理类是UDS服务的核心部分,它提供了与ECU进行通信以及执行诊断操作的基本功能。这些功能包括诊断会话的建立和终止、ECU的重置和诊断通信的管理。通过诊断和通信管理类,技术人员可以与ECU进行交互,获取ECU的状态信息,并执行各种诊断操作。主要包括如下服务:
| Service(点击即可跳转) | 功能简述 |
|---|---|
| 0x10:诊断会话控制 | 客户端控制目标ECU的诊断会话状态。 |
| 0x11:ECU复位 | 客户端强制让目标ECU执行复位操作。 |
| 0x27:安全访问 | 客户端请求解锁受保护的目标ECU。 |
| 0x28:通讯控制 | 客户端控制目标ECU中通信参数的设置(例如,通信波特率)。 |
| 0x3E:待机握手 | 客户端向目标ECU表明它仍然存在。 |
| 0x85:控制DTC的设置 | 客户端控制目标ECU中dtc的设置。 |
| 0x83:访问时间参数(待更新...) | 客户端使用此服务读取/修改当前通信的定时参数。 |
| 0x84:安全数据传输(待更新...) | 客户端使用此服务执行具有扩展数据链路安全性的数据传输。 |
| 0x86:事件响应(待更新...) | 客户端请求设置和/或控制目标ECU中的事件机制。 |
| 0x87:链路控制(待更新...) | 客户端请求控制通信波特率。 |
3.2 数据传输类
数据传输类是用于在ECU和诊断工具之间传输数据的UDS服务类别。它提供了可靠的数据传输机制,确保数据的完整性和准确性。数据传输类包括数据的读取和写入功能,允许技术人员读取和修改ECU中的数据。此外,数据传输类还支持数据的块传输,以提高数据传输的效率。主要包括如下服务:
| Service(点击即可跳转) | 功能简述 |
|---|---|
| 0x22:通过ID读数据 | 客户端请求读取由提供的DID标识的记录的当前值。 |
| 0x2E:通过ID写数据 | 客户端请求写入由提供的DID指定的记录数据。 |
| 0x23:通过地址读内存(待更新… …) | 客户端请求读取所提供内存范围的当前值。 |
| 0x24:通过ID读比例数据(待更新… …) | 客户端请求读取由提供的DID标识的比例数据。 |
| 0x2A:通过周期读ID数据(待更新… …) | 客户端请求调度目标ECU中的数据进行周期性传输。 |
| 0x2C:动态定义标识符(待更新… …) | 客户端请求动态定义数据标识符,这些标识符随后可能被0x22-读DID服务读取。 |
| 0x3D:通过地址写内存(待更新… …) | 客户端请求覆盖提供的内存范围。 |
3.3 存储数据传输类
存储数据传输类是一种特殊的数据传输类别,用于在ECU和诊断工具之间传输存储数据。存储数据可以是ECU的配置信息、故障码或日志文件等。通过存储数据传输类,技术人员可以读取和清除ECU中的存储数据,以便进行故障诊断和维修。所涉及的两个服务都是常用服务类型。主要包括如下服务:
| Service(点击即可跳转) | 功能简述 |
|---|---|
| 0x14:清除诊断信息(待更新... ...) | 允许客户端从目标ECU清除诊断信息(包括dtc、捕获的数据等)。 |
| 0x19:读取故障码信息(待更新... ...) | 允许客户端从目标ECU请求诊断信息(包括dtc、捕获数据等)。 |
3.4 IO控制类
IO控制类是用于控制ECU输入输出(IO)功能的UDS服务类别。它提供了对ECU输入输出功能的访问和控制,包括读取和设置ECU的输入输出状态。通过IO控制类,技术人员可以与ECU的IO功能进行交互,实现对车辆系统的控制和监控。主要包括如下服务:
| Service(点击即可跳转) | 功能简述 |
|---|---|
| 0x2F:通过ID控制输入输出 | 客户端请求控制特定于目标ECU的输入/输出。 |
3.5 例程功能类 - 调用ECU内部预置函数
例程功能类是一种特殊的UDS服务类别,它允许技术人员调用ECU内部预置的函数。这些函数可以执行特定的操作,如执行自检、执行校准或执行特殊功能。通过例程功能类,技术人员可以利用ECU内部的功能来进行诊断和维修。主要包括如下服务:
| Service(点击即可跳转) | 功能简述 |
|---|---|
| 0x31:例行程序控制 | 客户端请求启动、停止目标ECU中的例程(简单理解就是个函数)或请求例程结果。 |
3.6 上传下载类
上传下载类是用于在ECU和诊断工具之间进行数据上传和下载的UDS服务类别。它提供了将数据从ECU上传到诊断工具或将数据从诊断工具下载到ECU的功能。上传下载类可用于备份和恢复ECU配置、更新ECU软件或执行其他数据传输操作。主要包括如下服务:
| Service(点击即可跳转) | 功能简述 |
|---|---|
| 0x34:请求下载 | 客户端请求协商从客户端到目标ECU的数据传输。 |
| 0x36:数据传输 | 客户端向目标ECU发送数据(下载)或向目标ECU请求数据(上传)。 |
| 0x37:请求退出传输 | 客户端请求终止数据传输。 |
| 0x35:请求上传(待更新... ...) | 客户端请求从目标ECU到客户端的数据传输。 |
| 0x38:请求文件传输(待更新... ...) | 客户端请求在目标ECU和客户端之间进行文件传输。 |
四、写在最后
汽车软件开发、测试、维修等过程中,UDS协议的使用已经越来越广泛了,不管底层基于哪种物理总线实现ECU间或者诊断设备和ECU间的通信,应用层大多都会经过UDS协议封装数据包。但这个协议细节众多,直接看ISO 14229-1标准文件的话学习成本太高,对不常读英文手册的人来说看起来更是尤为烦躁,而网上很多文章通常直接截取标准文件中的图片加以简单说明,同样不够友好。因此开设该专栏,力争针对ISO14229-1标准做一份细致全面的中文手册,以便随手查阅。
近一年来,我从事车载操作系统的开发工作,即ECU固件软件的开发,又以ECU OTA升级为主要工作内容,对UDS、ECU软件刷写、部分BSW模块的开发有了一定的认识,后续将陆续开设各类专栏一方面对工作涉及的内容做较为全面的总结,一方面与大家分享,希望帮助更多的朋友进军汽车软件开发行业,共同学习进步!
>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<

发表评论 取消回复