在UDS(Unified Diagnostic Services,统一诊断服务)协议中,0x22服务(Read Data By Identifier,按标识符读取数据服务) 用于从ECU(电子控制单元)中读取特定数据标识符(DID,Data Identifier)对应的数据。该服务是诊断过程中最常用的服务之一,广泛应用于读取ECU的状态信息、配置参数、故障码等数据。以下是关于0x22服务的详细介绍,包括功能、请求格式、响应格式、使用场景和示例。
1. 0x22服务的基本功能
- 主要用途:从ECU中读取特定数据标识符(DID)对应的数据。
- 应用场景:
- 读取ECU的版本信息、序列号、硬件配置等静态数据。
- 读取ECU的运行状态、传感器数据、故障码等动态数据。
- 支持读取单个或多个DID。
2. 数据标识符(DID)
- DID定义:数据标识符是一个2字节的值,用于唯一标识ECU中的特定数据项。
- DID范围:
- 标准DID:由ISO 14229标准定义(如0xF100表示ECU序列号)。
- 厂商自定义DID:由ECU厂商定义(如0x0101表示特定传感器数据)。
3. 0x22服务的请求格式
0x22服务的请求报文格式如下:
字节位置 | 描述 | 值 |
---|---|---|
0 | 服务ID(SID) | 0x22 |
1-2 | 数据标识符(DID) | 2字节(如0xF100) |
3+ | 附加DID(可选) | 用于读取多个DID |
说明:
- 可以同时请求读取多个DID,只需在请求报文中依次列出DID即可。
- 示例:
- 读取单个DID:
22 F1 00
- 读取多个DID:
22 F1 00 F2 00
- 读取单个DID:
4. 0x22服务的响应格式
0x22服务的响应报文格式如下:
字节位置 | 描述 | 值 |
---|---|---|
0 | 响应服务ID(SID + 0x40) | 0x62 |
1-2 | 数据标识符(DID) | 2字节(如0xF100) |
3+ | 数据值 | 根据DID定义的长度 |
说明:
- 如果请求成功,ECU会返回一个正响应(Positive Response),格式为
62 <DID> <Data>
。 - 如果请求失败,ECU会返回一个负响应(Negative Response),格式为
7F 22 <NRC>
,其中NRC(Negative Response Code)表示失败原因。
5. 使用0x22服务的步骤
以下是使用0x22服务的典型步骤:
步骤1:建立诊断会话
- 使用0x10服务(Diagnostic Session Control)进入扩展诊断会话(如0x03)。
- 示例请求:
10 03
- 示例响应:
50 03
步骤2:发送0x22服务请求
- 根据需求发送0x22服务请求,指定要读取的DID。
- 示例1:读取单个DID(0xF100)
- 请求:
22 F1 00
- 响应:
62 F1 00 <Data>
- 请求:
- 示例2:读取多个DID(0xF100和0xF200)
- 请求:
22 F1 00 F2 00
- 响应:
62 F1 00 <Data1> F2 00 <Data2>
- 请求:
步骤3:解析响应数据
- 根据DID的定义解析响应报文中的数据值。
6. 示例场景
场景1:读取ECU序列号
- 目标:读取ECU的序列号(DID为0xF100)。
- 步骤:
- 进入扩展诊断会话:
10 03
→50 03
- 发送0x22服务请求:
22 F1 00
- 接收响应:
62 F1 00 12 34 56 78
(假设序列号为12 34 56 78
)
- 进入扩展诊断会话:
场景2:读取多个DID
- 目标:读取ECU的序列号(0xF100)和硬件版本(0xF200)。
- 步骤:
- 进入扩展诊断会话:
10 03
→50 03
- 发送0x22服务请求:
22 F1 00 F2 00
- 接收响应:
62 F1 00 12 34 56 78 F2 00 01 02
(假设序列号为12 34 56 78
,硬件版本为01 02
)
- 进入扩展诊断会话:
7. 注意事项
- DID定义:不同ECU支持的DID可能不同,需参考ECU的诊断规范。
- 数据长度:响应数据的长度取决于DID的定义,需根据规范解析。
- 权限要求:某些DID可能需要安全访问权限(0x27服务)才能读取。
总结
0x22服务是UDS协议中用于读取ECU数据的重要服务,通过指定数据标识符(DID),可以获取ECU的静态信息、动态状态或故障码等数据。使用时需遵循标准请求和响应格式,并根据具体需求选择合适的DID。在实际应用中,需注意DID的定义和权限要求,以确保数据的正确读取。