UDS解析

UDS协议

1前言

  • UDS (Unified diagnostic services)是一种在车辆内部进行数据交换的通信协议,主要用于车辆内部诊断、控制系统与车辆控制之间的交互。由欧洲汽车制造商协会(ACEA)和日本汽车制造商协会(JAMA)共同制定.
  • 属于应用层协议,可以基于CAN总线、以太网进行通讯。

2 UDS协议数据帧结构

图中包含了UDS中三种协议构成分别是 诊断请求 、诊断正响应回复 、诊断否定回复

  • spr=1, 抑制正响应,即ECU不给出正响应
  • spr=0, 需要ECU给出正响应
  • 如果某个服务没有sub-function,即没有第二个字节,那默认是要发正响应的
  • NRC:Negative Response Code,否定响应码,表示服务执行失败的原因
  • 0X7F:否定响应包头,表示服务执行失败。

2.1 uds 数据包解析

字节 名称 说明
0—2 源地址 表示发送数据的设备地址,通常为车辆控制器的地址。
2–4 目的地址 表示接收数据的设备地址,通常为车辆控制器的地址。
2---- x User data 包含uds内容。

2.2 诊断请求数据包解析

诊断请求是指诊断工具向车辆发送的请求消息,用于请求执行某个服务。诊断请求消息由三个部分组成:SID、子功能和实际数据。

字节 名称 说明
0–1 SID 用于标识要执行的服务
1–2 子功能 这个服务还能更进一步的划分或者具有启动/暂停之类的子功能
2–x 实际数据 是指在特定服务中需要传递的数据,例如读取车辆状态时,可能需要传递一个地址参数来指定要读取的变量



Service ID(SID)14229-1中定义了26种服务并将这些服务分为6大类
诊断和通信管理类、数据传输类、存储数据传输类、输入输出控制类、例程功能类、上传下载类。

诊断和通信管理类:用于实现车辆与诊断工具之间的连接,如启动/停止诊断、发送诊断命令等。

SID (Hex) 诊断服务名 服务Service
10 诊断会话控制 Diagnostic Session Control
11 ECU复位 ECU Reset
27 安全访问 Security Access
28 通讯控制 Communication Control
3E 待机握手 Tester Present
83 访问时间参数 Access Timing Parameter
84 安全数据传输 Secured Data Transmission
85 控制DTC的设置 Control DTC Setting
86 事件响应 Response On Event
87 链路控制 Link Control

数据传输类:用于实现车辆与外部设备的数据传输,如读取车辆状态、设置车辆参数等。

SID (Hex) 诊断服务名 服务Service
22 Read Data By Identifier 实现车辆与外部设备的数据传输,如读取车辆状态、设置车辆参数等。
23 Read Memory By Adress 通过地址读取内存
24 Read Scaling Data By Identifier 通过ID读比例数据
2A Read Data By Periodic Identifier 通过周期ID读取数据
2C Dynamically Define Data Identifier 动态定义标识符
2E Write Data By Identifier 通过ID写数据
3D Write Memory By Adress 通过地址写内存

存储数据传输类:用于实现车辆与外部设备的数据存储,如保存车辆状态、记录行驶轨迹等。

SID (Hex) 诊断服务名 服务Service
14 清除诊断信息 Clear Diagnostic Infomation
19 读取故障码信息 Read DTC Infomation

输入输出控制类:用于实现车辆与外部设备的输入输出控制,如启动/停止车辆、打开/关闭灯光等。

SID (Hex) 诊断服务名 服务Service
2F 通过ID控制输入输出 Input/Output Control By Identifier

例程功能类:用于实现车辆的特定功能,如紧急制动、自动巡航等。

SID (Hex) 诊断服务名 服务Service
31 例行程序控制 Routine Control

上传下载类:用于实现车辆与外部设备的数据上传和下载,如将车辆状态上传到服务器、从服务器下载车辆参数等。

SID (Hex) 诊断服务名 服务Service
34 请求下载 Upload/Download Control
35 请求上传 Request Upload
36 数据传输 Transfer Data
37 请求退出传输 Request Transfer Exit
38 请求文件传输 Request File Transfer

2.3诊断负响应码解析

诊断服务返回的负响应码,通常包含错误代码、错误描述等信息。例如,当车辆无法执行特定的诊断请求时,会返回一个负响应码,其中包含了错误代码和错误描述。这些信息可以帮助诊断员理解问题的原因,并采取相应的措施来解决问题。

字节 名称 说明
0—1 0X7F 负响应码包头
1–2 SID 负响应诊断服务编号
3----4 NRC 负响应码

负响应码:

错误代码 错误描述 错误代码 错误描述
0x01 - 0x0f 暂保留 0x78 收到请求,延迟响应
0x10 未知错误,服务被拒绝 0x79 - 0x7d 暂保留
0x11 不支持该服务请求 0x7e 当前会话下子功能不支持
0x12 不支持子功能 0x7f 当前会话下服务不支持
0x13 消息长度或格式错误 0x80 暂保留
0x14 请求信息长度超出 0x81 rpm(每分钟转速)太高
0x15 - 0x20 暂保留 0x82 rpm太低
0x21 服务端正忙 0x83 当前引擎正在运行
0x22 条件不满足 0x84 当前引擎未运行
0x23 暂保留 0x85 截止当前时间引擎运行时间太短
0x24 请求顺序错误 0x86 温度过高
0x25 指令已经被接收,但是未被执行 0x87 温度过低
0x26 失败的操作导致当前操作无法执行 0x88 车速过高
0x27 - 0x30 暂保留 0x89 车速过低
0x31 参数错误 0x8a 油门/踏板过高(超过了当前要求的最大阈值)
0x32 暂保留 0x8b 油门/踏板过低
0x33 安全校验未通过 0x8c 变速器档位不在空档
0x34 暂保留 0x8d 变速器档位不在排挡
0x35 密钥不匹配 0x8e 暂保留
0x36 已达到解锁最大错误次数 0x8f 制动开关没有关闭
0x37 超时时间未到 0x90 换挡杆不在驻车档
0x38 - 0x4f 由扩展数据链路安全性保留 0x91 变矩器离合器锁定
0x50 - 0x6f 暂保留 0x92 电压过高
0x70 不允许上传下载 0x93 电压过低
0x71 数据传输中断 0x94 - 0xef 暂保留(特定条件下)
0x72 擦除或烧写内存错误 0xf0 - 0xfe 为汽车制造商保留
0x73 块序列计数错误 0xff 暂保留
0x74 - 0x77 暂保留

3 uds过程解析

诊断仪 目标ECU 诊断请求(10 02) 诊断仪发送请求,byte1的10是SID byte2的01是sub-function,且可知Bit 7是0,即不抑制正响应 肯定的响应 (50 02 00 19 01 F4) 目标ECU给出响应: byte1是SID+0x40 = 50, byte2是sub-funtion 诊断仪 目标ECU
### 关于UDS报文解析的方法 #### 解析基础 UDS(Unified Diagnostic Services)是一种基于ISO 14229标准的汽车诊断协议,广泛应用于现代车辆的故障检测与维护。该协议定义了一系列的服务和数据结构来实现测试仪(Tester)与电子控制单元(ECU)之间的通信[^2]。 #### 报文组成 UDS报文通常由两部分构成:N_PCI(网络层协议控制信息)和N_DATA(实际数据负载)。具体来说: - **N_PCI** 的值集中体现在前几个字节中,主要用于描述当前帧的类型及其特性。 - **N_DATA** 则包含了具体的业务数据,其长度依据不同类型的帧而变化[^5]。 #### 帧类型分析 根据传输需求的不同,UDS支持多种帧格式,主要包括单帧(Single Frame)、首帧(First Frame)、连续帧(Consecutive Frames)以及流控帧(Flow Control Frame)。每种帧都有特定的作用及编码规则: 1. **单帧(SF)** - 当整个消息可以容纳在一个短帧内时使用。 - 数据字段长度由`SF_DL`指定,范围是从0至7个字节。 2. **首帧(FF)** - 表明一个多帧序列的开端。 - `FF_DL`表示后续所有帧加起来所能携带的最大数据量,理论上可达4095字节。 3. **连续帧(CF)** - 续接在首帧之后传送剩余的数据分片。 - 每一帧都带有顺序号`SN`以确保接收方能够正确重组原始消息。 4. **流控帧(FC)** - 提供一种机制让接收者调节发送者的节奏以防缓冲区溢出等问题发生。 - 包含三个关键参数:`FS`(流量状态),`BS`(块大小)还有`STmin`(最小时延). #### 实际操作指南 为了有效地解析这些复杂的UDS报文,以下是推荐的一些实践技巧: - 使用专门设计的支持CAN总线监听功能硬件工具配合软件平台来进行实时捕获并解码过程. - 需要熟悉各个SID(Service IDentifier)所对应的具体服务含义及其相应参数解释以便深入理解每一项指令背后逻辑[^3]. ```python def parse_udspdu(pdu): n_pci = pdu[:3] # Extract N_PCI part assuming fixed length of first three bytes as per reference [5] n_data = pdu[3:] frame_type = determine_frame_type(n_pci) if frame_type == 'SF': sf_dl = int(n_pci[-1]) & 0b01111111 # Last byte contains SF_DL value masked appropriately data = n_data[:sf_dl] elif frame_type == 'FF': ff_dl_high = ((int(n_pci[-2]) << 4) | (int(n_pci[-1]) >> 4)) & 0xFFF # Combine last two nibbles correctly according to standard ... return {"type":frame_type,"data_length":len(data),"payload":data} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值