UDS诊断系列之十五 通过DID读取数据(22)服务

本文介绍了通过DID读取数据服务,服务ID为0x22,可通过数据标识符读取ECU存储的数据。阐述了DID的定义、使用范围,说明了通过该服务读取数据的格式约定。还详细介绍了请求报文、响应报文和否定响应的格式及相关检查内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过DID读取数据服务,服务ID是0x22,主要功能是通过数据标识符(Data Identifier/DID)读取ECU存储的数据。

一、服务说明

先说什么是数据标识符(Data Identifier/DID,以下简称DID),它由两个字节组成,可以理解为一个编号,用来标识读取的是哪个数据。大部分OEM都会要求ECU内部存储一些数据或者一些运行时候的数据可以使用诊断仪或其他诊断设备读取,例如软硬件版本、序列号、某些传感器的实时数值、一些特殊配置状态等等,通过两个字节的标识符与对应的数据进行对应,这样就可以通过22服务加上对应的DID来读取相应的数据了。
为了规范使用,ISO14229-1规定了DID的使用范围,甚至定义了一些常用的DID所表示的内容,例如车辆VIN所使用的DID就是F190,任何车辆都要使用这个DID,具体范围可参考ISO14229-1的附录C.1。
通过22服务读取的数据格式,除固定格式以外,都由OEM和供应商约定。
通过22服务可以请求一个DID的数据,也可以请求多个,其数量限制也由OEM和供应商来约定。无论请求的DID数量是多少,只要满足数量限制,那么ECU都应该在一次肯定响应里包含所有数据,即使多个DID里面有重复的,响应的时候也要当成是两个单独的DID请求。

二、应用数据格式

1、请求报文

下表是22服务的请求格式,可以看到格式比较简单,第一个字节是服务标识22,后面每两个字节表示一个DID,通过cvt列也能看出至少要跟一个DID。
在这里插入图片描述

2、响应报文

响应报文格式稍复杂一些,第一个字节仍然是响应的SID,之后两个字节是被请求的DID,DID之后跟着对应的数据,长度根据实际的DID数据长度而定。如果请求了多个DID,那么后面的数据格式就是DID+DATA+DID+DATA…,这样一直循环下去,直到把所有的DID数据都响应完。
在这里插入图片描述

3、否定响应

下图是ISO14229-1里面给出的响应流程图。
在这里插入图片描述
首先应注意开始的两个NRC13所检查的内容是不一样的,第一次检查的是最小长度,即只读取一个DID的长度——SID+DID共3个字节,第二次检查的是最大长度——SID+DID*N,N即请求的DID个数是否满足要求,并且长度必须是奇数。
下面的循环主要检查的是请求的每个DID是否有安全或者其他条件限制:

  • NRC34:如果ECU支持29服务的认证,且被请求的DID需要认证后才能读取,那么需要检查请求之前是否已经通过认证;
  • NRC33:如果ECU支持27服务的校验,且被请求的DID需要校验后才能读取,那么需要检查请求之前是否已经通过校验;
  • NRC22:如果被请求的DID需要满足特定条件才能读取,那么需要检查当前是否满足读取的条件;

后面的检查就比较好理解了:

  • NRC31:如果请求的DID至少有一个是支持的,那么正常响应这个DID的数据,否则给这个否定响应码;
  • NRC14:如果请求的DID数据过长,ECU无法处理这么长的数据,那么给这个否定响应码。
<think>好的,用户的问题是关于UDS诊断服务中的22服务的定义。首先我需要确认用户的需求,他们可能是在进行汽车诊断或相关开发,需要了解服务22的具体定义和规范。根据用户提供的引用,特别是引用[1]提到了UDS服务中的DTC格式,而ISO 14229是UDS的标准,所以服务22应该在该标准中有详细说明。 接下来,我需要回忆UDS服务列表,服务22对应的是ReadDataByIdentifier,即通过数据标识符读取数据。用户需要具体的服务定义,包括功能、请求格式、响应格式以及可能的应用场景。需要确保回答符合ISO 14229-1的标准,并且引用用户提供的参考资料中的相关信息,比如引用[1]中提到的DTC格式可能与此服务相关,但服务22更侧重于读取数据而不是故障码。 然后,用户还要求生成相关问题。我需要考虑用户可能进一步询问的内容,比如服务22的数据标识符示例、服务22与其他服务的关系、实现时的注意事项等。这些问题需要围绕服务22展开,帮助用户深入理解。 最后,检查回答是否符合系统级指令的要求,如使用正确的中文、LaTeX格式,引用标识的正确添加等。确保回答结构清晰,步骤明确,并且引用了正确的文献来源。</think>### UDS诊断服务22号定义解析 根据ISO 14229-1标准,服务22($22_{hex}$)是**ReadDataByIdentifier**(按标识符读取数据服务。该服务允许诊断仪通过指定数据标识符(DID)从ECU中读取特定数据项[^1]。 #### 核心功能特性 1. **数据标识符范围**:支持$0000_{hex}$-$FFFF_{hex}$的2字节DID编码 2. **多数据访问**:单次请求可同时读取多个DID 3. **标准化结构**:遵循ISO 14229-1规定的统一请求响应格式 #### 协议格式规范 **请求报文格式**: $$ [\ 22\ |\ DID_1\ |\ DID_2\ |\ ...\ |\ DID_n\ ] $$ 其中每个DID占2字节 **正向响应格式**: $$ [\ 62\ |\ DID_1\ |\ Data_1\ |\ ...\ |\ DID_n\ |\ Data_n\ ] $$ #### 典型应用场景 1. 读取ECU序列号(DID $F18C_{hex}$) 2. 获取车辆VIN码(DID $F190_{hex}$) 3. 查询软件版本信息(DID $F194_{hex}$) 4. 读取标定数据(如DID $0100_{hex}$) #### 实现注意事项 - DID支持范围需在ECU诊断描述文件(CDD)中预先定义 - 数据长度根据具体DID定义可变 - 需配合ISO 15765-2传输协议实现多帧传输[^4] ```python # 示例:服务22请求处理伪代码 def handle_service_22(request): response = [0x62] for i in range(1, len(request), 2): did = (request[i] << 8) | request[i+1] data = get_did_data(did) # 从ECU数据库查询对应DID数据 response.extend([request[i], request[i+1]]) response.extend(data) return response ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChenglimK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值