【UDS】ISO14229之0x85服务


->返回总目录<-

前言

简称: “ControlDTCSetting”,控制诊断故障代码设置
功能: 该服务用于停止或重启ECU诊断故障代码状态位的更新


一、理论描述

控制类型的定义如下表:
在这里插入图片描述
01: 当ECU接收到子功能参数为关的控制诊断故障代码服务请求, 或进入不支持控制诊断故障代码设置服务的会话(如:会话层时序参数超时进入默认会话、电控单元复位等),诊断故障代码状态位信息应重新开始更新。
02
当ECU接受到子功能参数为开的控制诊断故障代码设置请求时,ECU应暂停诊断故障代码状态位的任何更新(即冻结当前数值),直到功能被重新使能。

注: 如果接收到测试工具发送的清除诊断信息( $14)服务, 0x85服务应不妨碍ECU诊断故障代码状态位的重置。

那么问题来了,该服务用在何处呢?
解答:和0x28通信控制服务很相似,主要用于FBL刷新ECU程序时候用到,FBL(Flash Bootload)主要是诊断仪与ECU节点之间通过CAN总线将需要更新的程序刷写进芯片之中。为了避免在刷新程序时由于CAN总线拥堵导致无法完成刷新任务的情况,我们会在刷新程序之前先调用0x28通信控制服务关闭该ECU节点的收发报文功能和0x85服务禁止DTC更新记录功能,这样针对该刷新任务就独占了ECU节点的CAN总线

~ ~ 我的总线我做主!无敌的我又迷路了。

二、使用步骤

1.请求

在这里插入图片描述

DTCSettingType :01 开启 02 关闭

请求报文: 85 01
在这里插入图片描述

请求报文: 85 02
在这里插入图片描述
解析报文log:
10 03 : 进入Extend会话模式
50 03 00 32 01 F4: 成功切换会话(00 32 01 F4 不必纠结,是两个诊断时间参数)
85 02: 请求停止DTC设置功能
C5 02: 完成停止DTC设置功能
14 FF FF FF FF: 请求清除DTC数据
54: 完成清除DTC数据(注:如果接收到测试工具发送的清除诊断信息服务, 0x85服务不妨碍ECU诊断故障代码状态位的重置。)
19 02 09: 读取满足DTC状态掩码09的DTC故障码
59 02 09: 正响应且无当前正在发生的故障
11 01: 请求ECU复位
51 01: 完成ECU复位

此时,我们制造写满足掩码09的故障码。
19 02 09: 读取满足DTC状态掩码09的DTC故障码
59 02 09 92 00 1C 09 92 01 1C 09…: 满足条件的DTC有 0x92001C和0x92011C(ECU复位时,诊断故障代码状态位信息应重新更新)

2.响应

1)正响应
在这里插入图片描述
参见CANoe图中的框

2)否定响应
支持的否定响应如下,一般工作上根据整车厂给的诊断输入文档来选择要支持的NRC码。
在这里插入图片描述

博主平日项目中支持NRC如下:

NRC12: Sub-Function不支持(请求数据 85 FF。而你请求的子功能FF根本找不到啊,规范里也没有FF子服务,ECU收到你这条报文,无法识别subfunc,因此回复该NRC)
在这里插入图片描述

NRC13: 请求报文数据长度有误(正确请求数据85 01 有2个字节。而你请求的是85 01 00有3个字节,ECU收到你这条报文,无法理解,因此回复该NRC)
在这里插入图片描述

NRC22: 请求条件不满足
(一般整车厂会告诉你NRC22的满足条件,例如:车速>3km/h,电源过欠压时候,请求服务,ECU便回复该NRC)

NRC7F: 当前诊断会话下不支持该服务(正常情况下,0x85服务支持的会话有 编程会话和外部扩展会话)
**NRC33:** 安全访问拒绝(在请求31服务之前,必须先解锁,否则ECU回复NRC33)

总结

0x85服务在实际运用中主要体现在ECU更新刷写程序时候才会使用到!
下一章 0x3E握手服务见!

->返回总目录<-

### 关于UDS 85服务的信息 ISO 15765标准定义了一种用于汽车网络通信的协议栈,其中包含了通用诊断服务(Universal Diagnostic Services, UDS)。从已知信息来看,UDS服务支持被划分为多个部分,其中包括一般信息、OBD规定的立法服务以及UDS本身所支持的服务[^1]。 对于具体的UDS 85服务而言,它通常指的是统一诊断服务中的某个特定功能或子集。然而,在现有的引用中并未直接提及关于UDS 85的具体细节。因此,以下是基于专业知识对该主题的一些补充说明: #### UDS 85服务的功能概述 UDS 85可能涉及的是ISO 14229-1标准下的某种扩展服务或者自定义实现。常见的UDS服务包括但不限于读取数据标识符(Read Data by Identifier)、写入数据标识符(Write Data by Identifier)、输入输出控制(Input Output Control),以及其他定制化功能。如果提到具体编号为“85”的服务,则可能是厂商专有的扩展服务之一,或者是针对某些特殊场景设计的功能模块。 为了进一步确认其确切含义,可以参考以下方法获取更多信息: 1. **查阅车辆制造商文档**:不同品牌和型号可能会对UDS进行个性化配置,建议查看对应车型的技术手册。 2. **分析ECU固件文件**:通过逆向工程手段提取并解析目标控制器内的软件逻辑,从而定位到该服务的实际作用范围及其交互流程。 3. **利用工具测试响应行为**:借助CANoe、Vector CANalyzer等专业设备发送请求帧至车载总线,并观察返回的结果包来推测此服务的目的所在。 ```python # 示例代码展示如何模拟发送一条简单的UDS请求消息 import can def send_uds_request(bus, arbitration_id, data): message = can.Message(arbitration_id=arbitration_id, data=data, is_extended_id=False) try: bus.send(message) print(f"Message sent on {bus.channel_info}") except can.CanError as e: print(e) if __name__ == "__main__": with can.interface.Bus(bustype='socketcan', channel='vcan0') as bus: uds_service_identifier = b'\x85' # 假设这是我们要查询的服务ID additional_payload = bytearray([0x00]) * 6 # 构造其余填充字节 full_data_field = bytes(uds_service_identifier + additional_payload) send_uds_request(bus, 0x7E0, full_data_field) # 使用假设的目标地址作为例子 ``` 上述脚本片段展示了怎样构建并向虚拟CAN接口广播一个携带指定SID (Service ID) 的诊断命令序列;当然实际应用当中还需要考虑更多因素比如超时处理机制等等。 --- ### 解决与排查问题的方法论 当遇到有关UDS 85服务的问题时,可以从以下几个方面入手解决: 1. **验证物理层连接状态** - 确认当前使用的硬件设施工作正常无误码现象发生; - 测试线路是否存在短路开路等问题影响信号传输质量。 2. **检查高层协议一致性** - 对照官方发布的API指南核实参数设置是否匹配预期值; - 如果涉及到跨平台操作还需注意端序差异可能导致的数据错乱情况。 3. **收集日志记录辅助判断** - 开启调试模式捕获完整的会话过程以便后续审查错误根源; - 运用专门的日志管理框架保存重要事件便于长期追踪维护。 4. **尝试降级兼容策略** - 当发现新版本引入不稳定性可暂时回退至上一稳定版继续运行; - 同样适用于探索潜在冲突源的过程之中逐步缩小怀疑区间直至锁定根本原因。 以上措施均需严格遵循相关行业安全规范执行以免造成不必要的损害风险增加额外成本负担。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

&春风有信

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

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

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

打赏作者

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

抵扣说明:

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

余额充值