UDS诊断和通信管理
title: UDS诊断和通信管理
date: 2024-07-31 14:34:49
tags:
- “车联网”
- “UDS诊断协议”
UDS 功能单元
诊断服务标识符分为以下功能单元:
- 诊断和通信管理
- 数据传输
- 存储数据传输
- 输入输出控制
- 远程激活常规控制
- 上传/下载
在本章中,我们将重点介绍诊断和通信管理。
诊断和通信管理
该诊断和通信管理功能单元用于控制ECU中的诊断和通信相关操作。
它提供以下服务。
- 诊断会话控制 - (0x10)
- ECU复位 – (0x11)
- 安全访问 – (0x27)
- 通信控制 – (0x28)
- 身份验证 – (0x29)
- 测试设备在线 – (0x3E)
- 访问时序参数 – (0x83)
- 安全的数据传输 – (0x84)
- 控制 DTC 设置 – (0x85)
- 事件响应 – (0x86)
- 链路控制 – (0x87)
0x10 诊断会话控制
诊断会话的服务 ID 为 0x10,响应 SID 为 0x50。
诊断会话控制是 UDS 使用的最重要的服务之一。诊断会话控制用于控制ECU的诊断会话。此服务用于将当前诊断会话更改为其他会话。
这些会话用于启用或禁用ECU中的一组特定诊断功能和特性。
UDS 中有许多可用服务,某些服务只有在 ECU 处于默认会话中时才能访问,而其他一些服务可以在其他会话中访问 ECU。
我们可以说这个诊断会话控制是访问ECU的网关。在执行任何诊断操作之前,此诊断服务应授予运行相应服务的访问权限。这是由汽车制造商决定的。
例如,假设在默认会话中,我们无法升级 ECU 的软件,因为默认会话无权对 ECU 进行重新编程。只有在编程会话中,我们才能由授权的线路工程师对ECU进行重新编程。
此诊断会话的主要目的是为 ECU 提供安全性。它将防止 ECU 进行不必要的访问。只有授权人员才能访问它。如果每个诊断服务都可以访问ECU,则它可能会因软件的错误闪烁而损坏。
因此,在发出任何诊断请求之前,客户端必须确保此服务在ECU当前会话中是可访问的或不可访问的。如果没有,则在执行所需的请求后首先发送会话更改请求。
如果服务器 (ECU) 处于非默认会话中,或者诊断处于非活动状态5秒钟,则ECU将进入默认会话。
这有许多子功能,下表中对此进行了解释。
| 子功能 | 描述 |
|---|---|
| 默认会话 (0x01) | 此会话处于空闲状态。每当 ECU 通电时,它只会处于此默认会话中。ECU 将保持默认会话状态,直到从客户端请求另一个诊断会话。 此会话中提供了写入数据字节标识符 (0x2E) 、读取数据字节标识符 (0x22) 、ECU 复位 (0x11) 、测试人员存在 (0x3E) 和读取 DTC (0x19) 等服务。 安全访问 (0x27) 不可用。与所有其他诊断会话控制子功能相比,此服务的安全性较低。 示例:在车库中,有人正在尝试读取诊断故障代码 (DTC) 。 |
| 编程环节 (0x02) | 此会话用于对ECU进行编程或将数据从客户端传输到服务器。 默认会话中允许的所有服务都允许在此会话中使用。 如果此会话结束或过期,ECU 将进入默认会话。 示例:编程会话时终端线工程师刷新校准软件。 |
| 扩展会话 (0x03) | 默认会话中允许的所有服务都允许在此会话中 此会话还用于解锁其他诊断功能 此会话中允许安全访问 (0x27) ,这意味着在此会话中已解锁安全级别 如果此会话结束或过期,则 ECU 进入默认会话 示例:此会话是下线工程师进行动态车辆测试以检查安全级别 |
| 安全系统 诊断系统 (0x04) | 用于测试所有安全关键型诊断功能。 此诊断会话控制子功能具有很高的安全性。 示例:此会话正在检查安全气囊和胎压监测器的安全性。 |
| 0x05 0x3F | 保留 |
| 特定车辆制造 (0x40 至 0x5F) | 此会话取决于每个 OEM,如果他们想根据自己的要求实现任何会话,他们可以使用它。 |
| 系统供应商特定 (0x60 0X7E) | 此会话也类似于车辆制造特定,但而不是车辆制造商,如果系统供应商想要根据其特定要求实施任何会话,则可以使用它。 |
| 0x7F | 保留 |
请求帧格式:
请求帧格式如下所示。
响应帧格式:
有两种类型的响应帧。这是一个积极的回应和一个消极的回应。
积极回应:
否定回应:
请查看以下示例,了解诊断会话转换
如果我们想从一个非默认会话切换到另一个非默认会话,首先我们需要切换到默认会话,然后我们可以切换到另一个非默认会话。
0x11 ECU 复位
ECU 重置的服务 ID 为 0x11,响应 SID 为 0x51。
ECU复位服务用于重新启动车辆中的特定ECU或所有ECU。这项服务的动机是将ECU从故障或挂起状态或非工作状态中恢复。
在ECU复位期间,它不会接受来自客户端的任何请求,也不会向客户端发送任何响应。此服务在扩展会话中受支持。
复位成功后,ECU将返回默认会话。
这有许多子功能,下表中对此进行了解释。
| 子功能 | 描述 |
|---|---|
| 硬复位 (0x01) | 硬复位意味着从ECU中取出电池 (电源) ,然后将ECU与电池重新连接。 在这种类型的复位中,ECU会重新初始化系统的核心硬件组件,并且还会重新初始化非易失性和易失性存储器。 此重置可能会丢失一些数据,因为在ECU运行期间电池突然被取出 |
| 重置时键关闭 (0x02) | 钥匙关开复位只是车辆的点火关断过程。这是微控制器的正常睡眠-唤醒模式。 当我们进行 Key Off On 复位 ECU 时,不会立即断电。它将进入启动模式,然后将所有数据存储在非易失性存储器中,并在不丢失任何数据的情况下取消初始化硬件变量。 在这种重置方法中,没有丢失数据的机会。这是重置的正确方法,大多数 OEM 都在使用这种类型的 ECU 重置。 |
| 软复位 (0x03) | 软重置只不过是重新启动应用程序的主要软件。当我们进行这种类型的重置时,微控制器的堆栈指针指向 main () 函数的地址。然后它将首先开始执行。 例如,将进行看门狗重置。每当挂起或发生任何故障时,该看门狗定时器将重置微控制器,并从 main () 函数启动 |
| 启用快速电源关断 (0x04) | 在这种类型的复位中,不会发生点火关闭。ECU将进入睡眠模式,ECU随时准备唤醒 |
| 禁用快速电源关机 (0x05) | 此服务用于禁用以前启用的快速电源关机 |
以下示例说明了ECU复位过程

0x27 安全访问
安全访问的服务 ID 为 0x27,响应 SID 为 0x67。
此安全访问诊断服务用于提供对 UDS 协议服务的安全访问,以避免安全漏洞。出于安全考虑,某些诊断数据和服务可能会受到限制。
此服务将授予对特定服务的读取和写入访问权限。在处理任何服务 ID (SID) 操作之前,必须检查安全访问,以了解客户端是否有权对此 SID 进行读取或写入。
例如,要上传和下载软件,无法由所有人访问常规控制和VIN (车辆识别号) DID,一些授权测试人员只能访问这些SID。
安全访问权限基于这两个授予,
- 1.Seed (0x01)
- 2.key (0x02)
- 测试人员使用 SID 0x27和子功能 ID 0x01发送解锁 ECU 的请求。0x01意味着请求种子。
- UDS 服务器接收请求,假设条件正确,并根据加密算法生成随机种子和密钥,服务器将种子发送到客户端并得到肯定的响应。
- 使用接收到的种子,测试工具生成密钥并将此密钥发送到服务器,以使用 SID 0x27和子功能 ID 0x02解锁 ECU。0x02 表示关键。
- 如果测试工具 (客户端) 发送的解锁密钥与服务器期望密钥匹配,则发送肯定响应并解锁ECU,否则将发送带有特定否定响应代码的否定响应。
以下示例说明了整个过程。
示例:
client requests the “Seed”,
27 SF,sf为奇数(odd) ==2n-1==,代表安全等级;server sends the “Seed”,
67 SF Seed, SF与请求中的值相等;如果服务端处于unlocked状态,则Seed为0;client sends the “Key” (appropriate for the Seed received),
27 SF Key,SF值为==2n==,即上一请求中的等级+1;server responds that the “Key” was valid and that it will unlock itself. 肯定响应
67 SF,SF 为 ==2n==
0x28 通信控制
通信控件的服务 ID 为 0x28,响应 SID 为 0x68。
此通信控制服务用于控制ECU服务器的通信。这意味着此服务通过诊断线启用或禁用来自服务器 (ECU) 的消息的传输或接收。
此服务用于控制ECU的发射器和接收器。测试人员可以同时使用多种类型的通信。
在希望为所有或一组ECU停止通信的上下文中,此服务非常有用。例如,可以在软件下载期间使用它,以最大限度地提高可用带宽。
有 3 种类型的通信类型可用,它们是:
- 正常通信消息 (0x01)
- 网络管理通信消息 (0x02)
- 正常通信消息和网络管理通信消息 (0x03)
下表解释了子功能。
| 子功能 | 描述 |
|---|---|
| 启用 Tx 和启用 Rx (0x00) | 在此类型中启用消息的传输和接收。 |
| 启用 Rx 并禁用 Tx (0x01) | 在此类型中,消息的传输被禁用,消息的接收被启用。 |
| 禁用 Rx 并启用 Tx (0x02) | 在此类型中,消息的传输处于启用状态,消息的接收处于禁用状态。 |
| 禁用 Tx 和 Rx (0x03) | 在这种类型的通信中,消息的传输和接收都被禁用。 |
以下示例说明了整个过程。
0x29 认证
此身份验证服务是在 ye 之后添加的ar 2020,这用于为比安全会计允许的更现代的身份验证方法提供标准化方法ess (0x27) 服务,包括使用基于 PKI 的证书交换进行双向身份验证。
身份验证的服务 ID 为 0x29,响应 SID 为 0x69。
0x3E 测试设备在线
测试设备的服务 ID 为 0x3E,响应 SID 为 0x7E。
它是UDS协议中的重要服务之一,我们将看到这个服务ID的用途。
此服务用于向服务器指示客户端仍连接到服务器。此服务用于使服务器在当前会话中保持活动状态,默认会话除外。
为了使客户端保持在当前会话 (非默认会话) 中,使用测试器在场 (0x3E) ,客户端将定期发送此服务 (0x3E) 。
如果客户端与服务器交换任何数据的时间不超过大约 5 秒的 S3 计时器值 (此计时值在下面的 S3 计时器中进行了说明) ,则出于安全考虑,服务器 (ECU) 将断开连接并自动回退到默认会话。
下表解释了子功能。
| 子功能 |
|---|
| 0x00 – 不支持 SuppressPosResMsgIndication (SPRMI) |
| 0x80 – SuppressPosResMsgIndication (SPRMI) 支持 (第 7 位已设置 – (SPRMIB) ) |
什么是 S3 计时器?
S3 服务器参数是在每个 ECU 中实现的服务器 (ECU) 端时序参数。S3 服务器参数的主要功能是在超时后从非默认会话 (编程、扩展、安全系统会话) 自动返回到默认会话。超时值仅基于 S3 参数。
当测试人员请求更改为非默认会话时,S3 计时器将启动,并且 S3 计时器值可能因 OEM 而异,但大多数 OEM 将 S3 值保留为 5 秒。
为什么我们需要 S3 计时器?
如果客户端在该期间的非默认会话中没有执行任何操作,则为了安全起见,ECU将自动进入默认会话。
假设服务器在超时后不进入默认会话并保持在相同的非默认会话中。如果我们启动车辆,ECU将无法工作。因此,可能会发生事故或其他故障。
SPRMIB:
抑制正响应消息指示位 (SPRMIB) 仅在具有子功能字节的子功能服务中受支持。该位用于定义 ECU 的正响应是否要向客户端公开
suppressPosResMsgIndicationBit仅通过 CAN 接口受支持,而 K 线和 ITS 接口不受支持。
如果服务支持 suppressPosResMsgIndicationBit,则位 7 将解释为suppressPosResMsgIndicationBit
- 当位 7 为“1” (SPRMIB=1) 时,ECU 不会向客户端发送正响应,这意味着它将抑制正响应。
- 当位 7 为“0” (SPRMIB=0) 时,ECU 将向客户端发送正响应,这意味着不抑制正响应。
- 如果服务不支持 SPRMIB,则它将发送否定响应 (不支持子函数) ,并显示 suppressPosResMsgIndicationBit (SPRMIB) =1
注意:使用 SPRMIB 我们只能抑制积极的反应。否定反应不能被抑制
以下是一些具有支持 SPRMIB 的子功能的服务。
| SID | 服务 |
|---|---|
| 0x10 | 诊断会话控制 |
| 0x11 | ECU复位 |
| 0x19 | 阅读DTC(故障诊断代码)信息 |
| 0x27 | 安全访问 |
| 0x28 | 通信控制 |
| 0x31 | 日常控制 |
| 0x3E | 测试人员在场 |
| 0x83 | 访问时序参数 |
| 0x85 | 控制DTC设置 |
| 0x97 | 链路控制 |
下面的例子解释了积极响应的完整过程
如果服务不支持 SPRMIB,则它将发送否定响应 (不支持子函数) suppressPosResMsgIndicationBit (SPRMIB) = 1。
我们知道现在的测试器只有两个子功能,即0x00和0x80。因此,不支持0x01 0x7F。如果发送不支持的子函数,则它将发送否定响应。
下面的示例解释了否定响应的完整过程。
0x83 访问时序参数
访问计时参数的服务 ID 为 0x83,响应 SID 为 0xC3。
此访问计时参数服务用于在此通信期间读取和写入通信链路的默认计时参数。在控制器和客户端之间的通信中,必须遵守某些时间。
如果在未发送任何消息的情况下超过这些值,则必须假定连接已中断。通过使用此服务,可以读取/写入超时值和消息间隔时间。
下表解释了子功能
| 子功能 |
|---|
| 0x01 – 读取扩展时序参数集 |
| 0x02 – 将时序参数设置为默认值 |
| 0x03- 读取当前活动的时序参数 |
| 0x04- 将时序参数设置为给定值 |
| 建议在物理寻址方法中使用此服务 (0x83) ,因为服务器支持一组不同的扩展时序参数。 |
0x85 控制 DTC 设置
控件 DTC 设置的服务 ID 为 0x85,响应 SID 为 0xC5。
通常,诊断故障代码 (DTC) 用于指示由ECU引起的故障。在某些情况下,测试人员可能会认为不检测ECU中发生的某些错误。
届时,我们可以使用这项服务。当客户端/测试人员在发生故障时需要停止或恢复服务器/ECU更新DTC时,使用控制DTC设置服务。
当客户知道车辆中的问题但试图通过做一些额外的实验来找到根本原因时,这将非常有帮助。
控制DTC设置服务用于打开或关闭故障错误代码的检测。
当客户端请求服务器关闭时,服务器会收到请求并暂时关闭此功能,并且服务器将保留当前值并挂起新值。
稍后,当客户端请求服务器打开时,服务器将使用新值进行更新
如果在控制 DTC 设置处于 OFF 状态时,用户请求清除诊断信息服务 (0x14) ,则服务器仍可能清除 DTC 信息。
如果客户端在服务器的 DTC 设置已处于 OFF 模式时请求关闭服务,则服务器将以肯定响应进行响应,并将忽略该请求。
下表解释了子功能。
| 子功能 |
|---|
| 打开 – 0x01 |
| 关闭 - 0x02 |
以下示例说明了整个过程。
0x86 事件响应
“事件响应”的服务 ID 为0x86,“响应 SID”为0xC6。
此事件响应服务请求服务器启动或停止对特定事件的响应传输。当发生特定事件时,此服务会自动执行诊断服务,而无需从客户端获取请求。
客户端使用可选事件参数指定事件,并使用在事件发生时要执行的服务参数指定服务。使用此服务测试仪可以将ECU配置为在发生任何定义的事件时向测试仪发送响应,而无需请求。
例如,假设电源中断是车辆中的事件。如果在驱动ECU时发生电源中断,它将不会等待测试人员的请求。ECU会将响应发送给测试仪/客户端。在这种情况下,测试人员将收到否定的响应。
下表解释了子功能。
| 子功能 |
|---|
| 0x00 – 停止事件响应 |
| 0x01- 关于 DTC 状态更改 |
| 0x02 – 定时器中断 |
| 0x03 – 关于更改数据标识符 |
| 0x04 – 报告激活的事件 |
| 0x05 – 在事件时开始响应 |
| 0x06 – 对事件的明确响应 |
| 0x07-关于价值的比较 |
0x87 链路控制
链接控件的服务 ID 为 0x87,响应 SID 为 0xC7。
链路控制可用于更改客户端和服务器之间的通信参数,以提高波特率。因此,测试人员可以非常快速地在测试人员和服务器之间交换数据。
下表解释了子功能。
| 子功能 |
|---|
| 0x01 – 使用固定波特率验证波特率转换 |
| 0x02 – 使用特定波特率验证波特率转换 |
| 0x03 – 转换波特率 |



