UDS再学习之——NRC码

本文详细解读了ISO14229标准中的负响应代码(NRC码),包括0x01~0x7F通信相关的代码和0x80~0xFF特定条件代码,并列举了部分已定义和未定义的NRC码实例,助于故障诊断和理解车辆诊断协议。

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

在ISO 14229 中,负响应代码范围可以划分为3个范围:
   0x00:   服务器内部实现的 positiveResponse 参数值;
   0x01 ~ 0x7F:与通信相关的否定响应代码;
   0x80 ~ 0xFF:针对特定条件的否定响应代码,这些特定条件在服务器接收到请求的时间点不正确。

 在学习ISO 14229的过程中,我们肯定会接触到正负响应,而负响应的错误码(NRC码)是我们判断为什么出现负响应的重要判断依据。那么,在ISO 14229 中,有哪些NRC码是定义好了的?又有哪些是还没有被定义的?请查看下方的表格:


Hex    Name    Description
01    ISOSAEReserved    ISO 保留,暂时未定义
...
0F
10    GeneralReject    一般性拒绝。通常在无法准确描述错误时发出
11    serviceNotSupported    服务不支持。多出现在服务未被定义
12    sub-functionNotSupported    子功能不支持。多出现子功能未被定义
13    ncorrectMessageLengthOrInvalidFormat    报文长度错误
14    responseTooLong    响应字节数太长
15    ISOSAEReserved    ISO 保留,暂时未定义
...
20
21    busyRepeatRequest    过忙导致执行失败。多出现在快速发送请求
22    conditionsNotCorrect    条件不满足。多出现在整车状态无法满足诊断的需求
23    ISOSAEReserved    ISO 保留,暂时未定义
24    requestSequenceError    请求的顺序错误。多出现在没有首先接收请求的情况下接收sendKey子功能
25    noResponseFromSubnetComponent    子网无法响应
26    FailurePreventsExecutionOfRequestedAction    DTC出现了错误的记录。一般不出现
27    ISOSAEReserved    ISO 保留,暂时未定义
...
30
31    requestOutOfRange    请求超出范围
32    ISOSAEReserved    ISO 保留,暂时未定义
33    securityAccessDenied    安全访问模式错误
34    ISOSAEReserved    ISO 保留,暂时未定义
35    invalidKey    密钥key无效
36    exceededNumberOfAttempts    收到的invalidKey超过了允许的尝试次数
37    requiredTimeDelayNotExpired    NRC_36之后,安全访问锁定的时间内再次请求seed
38    reservedByExtendedDataLinkSecurityDocument    扩展数据链路层保留
...
4F
50    ISOSAEReserved    ISO 保留,暂时未定义
...
6F
70    uploadDownloadNotAccepted    上传/下载受限。多出现在通过诊断刷写程序
71    transferDataSuspended    数据传输中断。多出现在通过诊断刷写程序
72    generalProgrammingFailure    编程失败。多出现在通过诊断刷写程序
73    wrongBlockSequenceCounter    块序计算错误。多出现在通过诊断刷写程序
74    ISOSAEReserved    ISO 保留,暂时未定义
...
77
78    requestCorrectlyReceived-ResponsePending    请求正常接收,但应答正在响应中
79    ISOSAEReserved    ISO 保留,暂时未定义
...
7D
7E    sub-functionNotSupportedInActiveSession    该子功能在当前会话下不支持
7F    serviceNotSupportedInActiveSession    该服务在当前会话下不支持
80    ISOSAEReserved    ISO 保留,暂时未定义
81    rpmTooHigh    编程管理地址过高
82    rpmTooLow    编程管理地址过低
83    engineIsRunning    发动机运转。·
84    engineIsNotRunning    发动机未运转
85    engineRunTimeTooLow    发动机运行时间过短
86    temperatureTooHigh    温度过高
87    temperatureTooLow    温度过低
88    vehicleSpeedTooHigh    车速过高
89    vehicleSpeedTooLow    车速过低
8A    throttle/PedalTooHigh    油门/踏板太高
8B    throttle/PedalTooLow    油门/踏板太低
8C    transmissionRangeNotInNeutral    非空挡
8D    transmissionRangeNotInGear    不在指定档位
8E    ISOSAEReserved    ISO 保留,暂时未定义
8F    brakeSwitch(es)NotClosed    踏板开关未关闭
90    shifterLeverNotInPark    车辆处于非P档
91    torqueConverterClutchLocked    液力变矩器离合器锁定
92    voltageTooHigh    电压过高
93    voltageTooLow    电压过低
94    reservedForSpecificConditionsNotCorrect    预留给特定异常情况
...
EF
F0    vehicleManufacturerSpecificConditionsNotCorrect    预留给整车厂定义的特定异常情况
...
FE
FF    ISOSAEReserved    ISO 保留,暂时未被定义
 回过头来看所有的服务,其实并不是所有的NRC码均在服务中有提及到。但这并不意味着我们对于不在服务中定义的NRC码可以进行忽略,同样的,NRC码是我们快速判断故障原因的重要依据。

### UDS协议中的否定响应0x13 在UDS(Unified Diagnostic Services)协议中,否定响应代NRC, Negative Response Code)用于指示诊断请求未能成功执行的原因。对于特定的否定响应`0x13`,其含义为“消息长度错误”,表示接收到的消息长度不符合预期的要求[^1]。 #### 错误原因分析 当服务器返回否定响应`0x13`时,通常是因为客户端发送的诊断请求数据包的长度有误。具体可能包括以下几种情况: - 请求的数据字段数量不足或超出期望范围。 - 子功能参数缺失或多余。 - 数据帧结构与所定义的服务需求不符。 这些都可能导致接收端无法正确解析该条消息并触发相应的错误反馈机制[^2]。 #### 解决方法建议 针对上述提到的各种可能性,可以采取以下几个方面的措施来排查和解决问题: 1. **验证通信规约文档** 确认实际使用的诊断服务是否遵循最新的标准版本以及具体的实现细节说明文件;仔细核对待传输报文中各部分应该占据多少字节位数等规格描述信息。 2. **检查应用层逻辑设计合理性** 审视应用程序内部负责构建待发往ECU侧指令序列的部分是否存在缺陷——比如硬编固定大小缓冲区而忽视动态调整需求场景等情况发生概率较高,则需重新审视这部分算法模型架构设计思路是否有改进空间。 3. **利用工具辅助测试调试过程** 借助专业的汽车电子网络仿真平台或者CANoe/CANalyzer这类软件产品来进行交互操作模拟实验,在不同条件下观察现象变化规律从而定位根本症结所在之处。 以下是简单的Python脚本示例,展示如何检测一条假设性的诊断命令是否符合预设格式要求: ```python def validate_message_length(service_id, sub_function=None, data_fields=()): expected_len = { ' RoutineControl': lambda sf: 4 if sf != 0x03 else 7, # Add more service definitions as needed... } svc_name = get_service_name_by_id(service_id) min_len_func = expected_len.get(svc_name) actual_len = sum(map(len, (sub_function,) + tuple(data_fields))) + 1 if not callable(min_len_func): raise ValueError(f"Unsupported Service ID {service_id:#X}") required_min_length = min_len_func(sub_function or 0xFF) return bool(actual_len >= required_min_length) try: is_valid = validate_message_length(0x28, 0x02, ['\x0A\xB0']) except Exception as e: print(e) else: result_str = "Passes validation." if is_valid else "Fails validation." print(result_str) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值