读数据 0x22Read Data By Identifier1. 为什么需要这个服务2. 报文格式3. DID 是什么4. DID 的通用分类5. 数据格式怎么读6. 0x22 需不需要解锁7. 常见 NRC1. 为什么需要这个服务ECU 内部存储了很多信息硬件序列号、软件版本、配置参数、车辆状态等。Tester 需要一种方式来读取这些信息——这就是0x22Read Data By Identifier。每个信息有一个唯一编号叫DIDData Identifier占2 个字节。Tester 发请求我要读 DID 0xF1AAECU 返回这个 DID 对应的数据内容下面是 0x22 服务完整的「请求—判断—响应」流程满足不满足或不存在Tester 发送 0x22 请求22 DIDECU 查找该 DIDDID 存在且当前条件满足返回正响应62 DID 数据返回负响应7F 22 NRC2. 报文格式请求Tester → ECU22 DID高字节 DID低字节示例22 F1 AA表示读 DID0xF1AA。支持一次读多个 DID一条请求携带多个 DID22 F1AA F1AE F18C → 一次读 3 个 DIDECU 会把三个 DID 的数据一起返回。正响应ECU → Tester62 DID高字节 DID低字节 数据字段说明62正响应 SID0x22 0x40 0x62DID回显你请求的 DID 编号数据数据内容长度和格式由该 DID 的定义决定负响应7F 22 NRC下面用时序图描述一次报文的完整交互过程ECUTesterECUTesteralt[DID 可读][DID不可读或不存在]22 F1 AA62 F1 AA 数据7F 22 NRC3. DID 是什么DID 是一个2 字节编号指向 ECU 内部的一块数据。可以理解为 ECU 里维护着一个大字典DID 0xF1AA → 硬件序列号 DID 0xF1AE → 软件版本信息 DID 0xDD0A → 使用模式 DID 0xF190 → VINDID 的定义在 ECU 的诊断描述文件里如 CDD 文件或模块 XML。每个 DID 包含编号recordId名称数据格式字节如何解析成可读值转换方式BCD、ASCII、枚举等可以把 DID 理解为一张「索引 → 数据」的映射表DID 0xF1AA硬件序列号DID 0xF1AE软件版本信息DID 0xDD0A使用模式DID 0xF190VIN 车辆识别码4. DID 的通用分类信息类 DID通常位于 F1xx 段DID含义F1AA硬件序列号Core Assembly PNF1AB交付序列号Delivery Assembly PNF1AE软件版本信息Software Load ModuleF1A0应用诊断数据库零件号F18C序列号F190VIN车辆识别码以上是 ISO 14229 附录中建议的标准化 DID大部分车企都遵循。状态类 DID这类 DID 各车企自定义例如使用模式、车辆模式等。DID 编号和枚举值因项目而异需查对应 ECU 的诊断规范。5. 数据格式怎么读原始字节的解析思路如下具体解析方式完全由各 DID 的定义决定BCD ASCII单字节枚举长度前缀 循环收到正响应62 DID 原始字节取出数据段按 DID 定义选择解析方式展开 BCD 并转换 ASCII查枚举表映射为名称按数量与单条长度循环截取DID 返回的数据是原始字节如何转换为可读值取决于 DID 定义。下面介绍几种常见格式。BCD ASCII 混合编码如 0xF1AA 硬件序列号62 F1AA 6608716844 41解析规则前 5 字节 BCD 编码的零件号每 4 bit 代表一个十进制数字第 6 字节 ASCII 字符0x41A 版本号组合结果 6608716844A单字节枚举如使用模式62 DD0A 01只有 1 个字节值0x01 Inactive。DID 定义中会有一个枚举表把每个值映射到具体名称。长度前缀 循环结构如 0xF1AE 软件版本62 F1AE 02 640651900142 640652000142 ...解析规则第 1 字节 软件部件数量后面每 N 字节 一个「部件号 版本号」测试程序按「数量 × 单条长度」截取逐条解析比对6. 0x22 需不需要解锁一般不需要。读 DID 在 Default Session 下即可完成。但部分 ECU 对某些敏感 DID如密钥、安全常量会要求先解锁才能读取具体取决于 ECU 供应商的安全策略。7. 常见 NRCNRC名称含义0x13Incorrect Message Length请求长度不对少发了字节0x14Response Too Long一次读太多 DID响应超出最大长度0x22Conditions Not CorrectDID 存在但当前条件不满足如需要解锁0x31Request Out Of RangeECU 没有这个 DID0x31和0x22的区别0x31 ECU 根本没有这个 DID永远不会返回0x22 DID 存在但当前条件不允许读取收到负响应后可以根据 NRC 快速判断失败原因0x310x220x130x14收到负响应7F 22 NRC判断 NRC 值ECU 没有这个 DIDDID 存在但条件不允许请求消息长度不对响应超出最大长度