多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

UDS诊断 NRC码(否定响应码)详解

UDS诊断 NRC码(否定响应码)详解 一、NRC 基本概念NRCNegative Response Code否定响应码是 UDSISO 14229协议中当 ECU服务端无法执行诊断仪客户端发送的请求时返回的错误标识用于告知诊断仪为什么拒绝。否定响应报文格式0x7F [请求的SID] [NRC]字节含义示例Byte 0固定长度0x30x3Byte 1固定值0x7F表示否定响应7FByte 2被拒绝的请求服务IDSID22读DID服务Byte 3否定响应码NRC31请求超出范围举例诊断仪发送22 F1 90读取VIN码ECU不支持该DID则回复7F 22 31→ 表示读DID服务被拒绝原因是请求超出范围二、NRC 码范围分组NRC 取值范围为0x00 ~ 0xFF分为三大组范围分类说明0x00内部使用服务器内部判断逻辑用表示应给出肯定响应不会出现在总线上0x01 ~ 0x7F通用/通信相关ISO 14229 标准定义的通用否定响应码0x80 ~ 0xFF服务/条件相关因特定条件不满足而返回提供更细化的拒绝原因三、通用 NRC 码详解0x01 ~ 0x7F 请求格式/协议类错误NRC英文名称中文含义触发场景0x10generalReject一般拒绝不属于其他任何已定义NRC的拒绝原因0x11serviceNotSupported服务不支持ECU 根本不实现该 SID 服务0x12subFunctionNotSupported子功能不支持支持该服务但不支持请求中的子功能参数0x13incorrectMessageLength OrInvalidFormat报文长度/格式错误请求报文的数据长度或参数格式与定义不一致0x14responseTooLong响应过长响应数据超过传输层最大长度如超过CAN帧限制 状态/条件类错误NRC英文名称中文含义触发场景0x21busyRepeatRequest忙-请重试ECU 正忙如正在执行刷写暂时无法处理0x22conditionsNotCorrect条件不满足执行前提条件未满足如车速不为0、未进入扩展会话等0x24requestSequenceError请求顺序错误多步操作的执行顺序不对如未先请求下载就发送数据0x25noResponseFrom SubnetComponent子网组件无响应网关转发到子网ECU后子网ECU无响应0x26failurePrevents Execution故障阻止执行ECU内部存在故障阻止了请求的执行 安全/权限类错误NRC英文名称中文含义触发场景0x31requestOutOfRange请求超出范围请求的DID/地址/参数超出ECU支持范围0x33securityAccessDenied安全访问被拒绝未通过安全访问27服务就执行了需要权限的操作0x35invalidKey无效密钥安全访问中发送的密钥Key计算错误0x36exceededNumberOfAttempts超过尝试次数安全访问密钥连续错误次数超限ECU锁定0x37requiredTimeDelay NotExpired延迟时间未到期安全访问锁定后等待时间未到就再次请求 数据传输/编程类错误NRC英文名称中文含义触发场景0x70uploadDownload NotAccepted上传/下载不被接受ECU 拒绝上传/下载请求如地址无效0x71transferDataSuspended数据传输暂停数据传输过程中被挂起如电压异常0x72generalProgrammingFailure一般编程失败Flash写入失败、校验失败等0x73wrongBlockSequenceCounter块序列号错误TransferData36服务的块序号不连续 会话/流程控制类NRC英文名称中文含义触发场景0x78requestCorrectlyReceived ResponsePending已收到请求-响应待处理ECU 需要更多时间处理先回复此码后续再给最终响应0x7EsubFunctionNotSupported InActiveSession当前会话不支持该子功能子功能在当前诊断会话下不可用0x7FserviceNotSupported InActiveSession当前会话不支持该服务整个服务在当前诊断会话下不可用四、服务相关 NRC 码0x80 ~ 0xFF范围分类说明0x80 ~ 0x9F服务相关针对特定服务的细化拒绝原因0xA0 ~ 0xDF子功能/条件相关针对特定子功能的细化拒绝原因0xE0 ~ 0xFFOEM供应商自定义由主机厂/供应商自行定义例如某些OEM定义0xE0为电池电压过低、0xE1为发动机运转中等。五、NRC 优先级判断顺序当 ECU 收到请求后按以下优先级从高到低依次检查命中即返回对应NRC① 0x78 responsePending需要时间处理时最先发出 ② 0x11 serviceNotSupported服务是否支持 ③ 0x7F serviceNotSupportedInActiveSession当前会话是否支持 ④ 0x12 subFunctionNotSupported子功能是否支持 ⑤ 0x7E subFunctionNotSupportedInActiveSession当前会话子功能 ⑥ 0x13 incorrectMessageLengthOrInvalidFormat报文长度/格式 ⑦ 0x22 conditionsNotCorrect执行条件 ⑧ 0x33 securityAccessDenied安全权限 ⑨ 0x31 requestOutOfRange参数范围 ⑩ 0x21 busyRepeatRequest忙状态 ⑪ 0x24 requestSequenceError顺序错误六、典型场景举例 例1服务不支持NRC 0x11请求 02 09 02 00 00 00 00 00 ← 09服务读取排放信息 响应 03 7F 09 11 00 00 00 00 ← ECU不支持09服务解析7F否定响应09被拒绝的服务11服务不支持 例2子功能不支持NRC 0x12请求 02 10 05 00 00 00 00 00 ← 10服务子功能0x05不存在的会话类型 响应 03 7F 10 12 00 00 00 00 ← 支持10服务但不支持子功能05 例3报文长度错误NRC 0x13请求 03 22 F1 90 AA 00 00 00 ← 22服务多带了一个字节AA 响应 03 7F 22 13 00 00 00 00 ← 长度应为3字节实际4字节 例4条件不满足NRC 0x22请求 02 10 03 00 00 00 00 00 ← 请求进入扩展会话(0x03) 响应 03 7F 10 22 00 00 00 00 ← 车速0不允许切换会话常见条件车速非零、发动机运转、未切换到默认会话等 例5安全访问被拒NRC 0x33请求 03 2E F1 90 56 49 4E 31 ← 2E服务写DID需要安全权限 响应 03 7F 2E 33 00 00 00 00 ← 未执行27服务解锁正确流程先27 01请求Seed→27 02发送Key→ 再执行2E 例6密钥错误NRC 0x35请求 06 27 02 AA BB CC DD 00 00 ← 27服务发送Key计算错误 响应 03 7F 27 35 00 00 00 00 ← 密钥不匹配 例7安全访问锁定NRC 0x36 → 0x37第1次错误Key → 7F 27 35密钥无效 第2次错误Key → 7F 27 35 第3次错误Key → 7F 27 36超过尝试次数锁定 立即再请求 → 7F 27 37延迟时间未到期请等待 等待10秒后 → 27 01 正常返回Seed解锁成功 例8响应待处理NRC 0x78请求 02 31 01 FF 00 00 00 00 ← 31服务执行例程耗时操作 响应①03 7F 31 78 00 00 00 00 ← 先回复正在处理请等待 响应②04 71 01 FF 00 55 00 00 ← 最终肯定响应71310x40⚠️ 诊断仪收到0x78后应启动P2*定时器通常5000ms等待最终响应。 例9当前会话不支持服务NRC 0x7F请求 02 34 00 00 00 00 00 00 ← 在默认会话(01)下请求下载服务 响应 03 7F 34 7F 00 00 00 00 ← 34服务仅在扩展/编程会话下可用正确流程10 03扩展会话→27安全解锁→34请求下载 例10块序列号错误NRC 0x7334服务 → 肯定响应 36服务 BlockCounter01 → 肯定响应 36服务 BlockCounter03 → 7F 36 73 ← 跳过了02序列号错误七、NRC 速查总结表NRC助记一句话解释常见关联服务0x10generalReject兜底拒绝所有0x11serviceNotSupported压根没这个服务所有0x12subFunctionNotSupported子功能不认识10/27/31等0x13wrongLength/Format报文长度或格式不对所有0x14responseTooLong响应数据太长22/23等0x21busyECU忙稍后重试所有0x22conditionsNotCorrect前提条件没满足10/2E/31/34等0x24sequenceError操作顺序不对34/36/370x31outOfRange参数/DID/地址超范围22/23/2E/31/340x33securityDenied没解锁就想操作2E/31/34/35等0x35invalidKey密钥算错了270x36exceededAttempts错太多次锁了270x37timeDelayNotExpired锁定冷却中270x70uploadDownloadNotAccepted拒绝上传/下载34/350x71transferSuspended传输被暂停360x72programmingFailure刷写失败36/370x73wrongBlockCounter块序号不对360x78responsePending还没处理完等着所有0x7EsubFuncNotInSession当前会话没这子功能10/27等0x7FserviceNotInSession当前会话没这服务2E/31/34等八、调试建议收到0x78不要认为失败启动 P2* 定时器通常 5s继续等待最终响应。收到0x22检查是否满足前置条件会话类型、车速、电压、发动机状态等。收到0x33确认是否已完成27安全访问流程Seed → Key。收到0x7F确认当前诊断会话是否正确如刷写需先进入02编程会话。收到0x13仔细核对请求报文的字节数和参数格式是否与协议定义一致。收到0x36/0x37ECU 已被锁定需等待冷却时间通常 10s后重新请求 Seed。核心原则NRC 是 ECU 给诊断工程师的排错指南看到 NRC 后应对照协议逐项排查而非盲目重发。
返回列表