文章目录
- 常见缩写
- 简介
- UDS寻址模式
- 1. 物理寻址(点对点、一对一)
- 2. 功能寻址(广播、一对多)
- 3. 功能寻址使用场景举例
- UDS报文格式
- UDS协议栈
- 网络层
- 网络层功能
- 网络层协议
- 1. 单帧 SF(Single Frame)
- 2. 首帧 FC(First Frame)
- 3. 流控帧 FC(Flow Control Frame)
- 4. 连续帧 CF(Continuous Frame)
- 定时参数
- UDS诊断服务
- 1. 诊断和通信管理功能单元
- 2. 数据传输功能单元
- 3. 存储数据传输功能单元
- 4. IO 控制功能单元
- 5. 例程功能单元
- 6. 上传下载功能单元
- 引用与参考
常见缩写
ECU: 电 子 控 制 单 元UDS:Unified Diagnostic Service( 统 一 诊 断 服 务 )SID:Service Identifier(服 务 标 识 符 )DID:Data Identifier(数 据 标 识 符 )DTC:Diagnostic Trouble Code(故 障 诊 断 代 码 )NRC:Negative Response Code(否 定 响 应 码 )EOL:End Of Line(下 线 )ISO:International Standards Organization(国际标准组织)NA:Not Applicable(不适用)NRC: 否定响应代码USDT: Unacknowledged Segmented Data Transfer(不需响应的分段数据传输)APP: Application(应用程序)FBL: Flash Boot Loader(刷写引导程序)OBD: 车辆诊断连接接口
简介
UDS本质上是一系列服务的集合。UDS的服务包含6大类,共26种。每种服务都有自己独立的ID,即SID(Service Identifier)。
UDS本质上是一种定向的通信,是一种交互协议(Request/Response)

Tester发给ECU的数据,应包含 SID,且SID处于该 应用层数据 的第一个字节。
- 如果是肯定的响应
(Positive Response),首字节回复[SID+0x40]外,其他字节根据服务返回;例如,请求0x10,响应返回0x50 - 如果是否定的响应
(Negative Response),首字节回复0x7F,第二字节回复刚才询问的SID,第三字节是NRC(否定响应码),代表否定的依据

- 如上图,
Tester向ECU发送的数据 为02 10 01 AA AA AA AA AAN_PCI=02, 表示 此帧为单帧,有效数据长度为2N_Data=10 01, 表示 Tester 发送的有效信息,请求ECU进入默认会话AA AA AA AA AA为自定义自动填充数据
ECU给Tester响应的数据 为06 50 01 00 32 01 F4 CCN_PCI=06, 表示 此帧为单帧,有效数据长度为6N_Data=50 01 00 32 01 F4,50 =[SID+0x40], 后面为该服务返回数据CC为自定义自动填充数据
UDS寻址模式
1. 物理寻址(点对点、一对一)
根据物理地址的不同进行访问,但只能访问(通过CAN ID访问)单个ECU节点,Tester为SA源地址,ECU作为TA目标地址
2. 功能寻址(广播、一对多)
根据功能的不同进行访问,它能访问(通过CAN ID访问)多个ECU节点,对于标准帧来说,通常是0x7DF,也就是说本网络中所有ECU都要对这条指令做出响应,即一对多模式
每个ECU 都有2个 CAN的诊断帧ID,分别对应物理寻址时 ECU发到CAN线上的报文CAN ID和处理指定CAN ID的数据报文
通常由主机厂来确定不同ECU的这两个特定的诊断ID。比如0x701对应接收Tester的消息,0x709对应发给Tester的消息
3. 功能寻址使用场景举例
- 刷写前使用
0x85(ControlDTCSetting)服务关闭ECU故障检查功能 - 刷写前使用
0x28(CommunicationControl)服务对某些ECU禁言 - 使用
0x14(ClearDiagnosticInformation)服务清除多个ECU DTC等
UDS报文格式

UDS协议栈
UDS协议栈主要分为网络层和应用层两大部分

网络层
为了解决ISO 11898 协议中的经典can数据链路层与UDS 应用层 ISO 14229 协议中定义的应用层,彼此的数据长度不一样问题。经典can数据链路层最大支持8字节,但 ISO 14229 不仅仅支持can总线设计的,其最大容量是达到4095字节。
例如,UDS应用需要发送20字节数据信息,而 经典CAN不能一帧报文处理完,需要3帧才能发送完毕。那么如何将多字节数据通过can进行有效,有序的传输呢?ISO 15765-2 由此而生。
网络层功能
- 应用层诊断服务can数据帧的转发;
- 多帧数据传输,进行数据的打包、解包,协调上下层工作;
网络层协议
N_PDU(网络层协议数据单元) 一般包含3个领域,N_PDU: { N_AI, N_PCI, N_Data }
| 参数名称 | 缩写 | 描述 |
|---|---|---|
| 寻址信息 | N_AI | 隐含源地址、目标地址和寻址方式信息 |
| 协议控制信息 | N_PCI | 用于标识N_PDU帧类型 |
| 数据 | N_Data | 包含应用层数据A_Data |
网络层对于N_PDU分为单帧(SF)、首帧(FF),流控帧(FC),连续帧(CF)这四种类型,每种类型是通过协议控制信息(N_PCI)进行区分的,每一个N_PDU都只有一个N_PCI。通常对于CAN诊断来说,就可以通过识别每条CAN帧数据域的 首个字节 来确定它属于四种类型中的哪类。
| N_PDU类型 | N_PCI | |||
|---|---|---|---|---|
| Byte 1 | Byte 2 | Byte 3 | ||
| Bit 7-4 | Bit 3-0 | |||
| 单帧(SF) | N_PCI Type = 0 | SF_DL <= 7 | N_Data | |
| 首帧(FF) | N_PCI Type = 1 | 7 < FF_DL <= 4095 | N_Data | |
| 流控帧(FC) | N_PCI Type = 3 | FS | BS | STmin |
| 连续帧(CF) | N_PCI Type = 2 | SN (0-F循环计数) | N_Data | |
网络层分为单帧和多帧,单帧(SF)就是一帧can报文8字节内就可以把uds数据处理完毕。多帧就是一帧can报文8字节内处理不完,需分为首帧(FF),流控帧(FC),连续帧(CF)来处理。网络层还有时间参数,如N_Ar、N_As、N_Br、N_Bs、N_Cr、N_Cs。后续网络层会详细讲解。
1. 单帧 SF(Single Frame)
单帧 顾名思义就是一帧can报文就可以处理完uds服务
2. 首帧 FC(First Frame)
发送方发送 N_Data 数据过长 时,则需要拆分成多帧报文 ,被拆分后的报文需要通过多个N_PDU来发送,而接收方接收到多个N_PDU信息后进行重组。
发送方发送多帧时,需要先发送首帧来告知接收方有多少字节数要发送到接收方。
3. 流控帧 FC(Flow Control Frame)
UDS多帧通讯时:
- 发送方 发送首帧FF 给接收方。
- 接收方接收到首帧, 解析首帧
- 接受方根据自身条件判断后(如:接收数据缓存大小,接收数据快慢能力,当前是否可以接收数据等), 回复一帧流控帧FC给发送方。
- 发送方根据接收到接收方的流控帧FC来决定后续的操作。
FS (Flow State) 流状态:
- 0 : 继续发送
- 1 : 等待
- 2 : 溢出,即第一帧中的FF_DL信息的长度超过接受实体缓冲区的大小)
BS 表示 块大小(允许一次可连续发送连续帧 CF 的次数)
STmin 表示 发送方发送连续帧 CF 与连续帧 CF 间的最小间隔时间
4. 连续帧 CF(Continuous Frame)
发送方发送首帧FF,然后接收到接收方的流控帧FC后,若条件允许可继续发送信息,则需根据连续帧CF的控制信息格式来发送信息。
对于所有的拆分信息,SN开始于0。第一帧应当分配值为0。 虽然第一帧 N_PCI 没有明确表示出序列号,但是应该将首帧当作0号序列对待,第一个流控帧FC后的 连续帧SN设置为1,同一拆分信息上,每一个新增的连续帧顺序号SN增1,连续帧顺序号SN的值不受流控帧的影响,当连续帧顺序号SN值为0x0F时,下一个连续帧中将顺序号SN重置为0。
定时参数
网络层定义了N_Ar、N_As、N_Br、N_Bs、N_Cr、N_Cs六个时间参数
| 定时参数 | 描述 |
|---|---|
N_As | 发送方数据帧经数据链路层发送的时间 |
N_Ar | 接收方数据帧经数据链路层发送的时间 |
N_Bs | 发送方接收流控制帧的等待时间 |
N_Br | 接收方发送流控制帧的间隔时间 |
N_Cs | 发送方发送连续帧的间隔时间 |
N_Cr | 接收方接收连续帧的等待时间 |
N_As超时:发送方没有及时发送N_PDU。N_Ar超时:接收方没有及时发送N_PDU。N_Bs超时:发送方没有接收到流控帧。N_Br超时:接收方没有发出流控帧。N_Cs:即STmin,发送两个连续帧需要等待的最短时间,N_Cr最大1000msN_Cr超时:接收方没有收到连续帧。
UDS诊断服务
1. 诊断和通信管理功能单元
| 序号 | ID | 服务 | 说明 | 服务详解 |
|---|---|---|---|---|
| 1 | 0x10 | Diagnostic Session Control (诊断会话控制) | 客户端请求通过服务器控制会话 | 点击此处跳转 |
| 2 | 0x11 | ECU Reset (ECU重置) | 客户端强制服务器执行重置 | 点击此处跳转 |
| 3 | 0x27 | Security Access (安全访问) | 客户端请求解锁受保护的服务器 | 点击此处跳转 |
| 4 | 0x28 | Communication Control (通信控制) | 客户端控制服务器内通信参数的设置(例如,通信波特率) | 点击此处跳转 |
| 5 | 0x3E | Tester Present (测试仪 保活) | 客户端向服务器发送其仍处于保活状态消息 | 点击此处跳转 |
| 6 | 0x83 | Access Timing Parameter (访问计时参数) | 客户端使用该服务来读取/修改 有效通信的计数参数 | 点击此处跳转 |
| 7 | 0x84 | Secured Data Transmission (受保护的数据传输) | 客户端使用该服务来执行具有扩展数据链路安全性的数据传输 | 点击此处跳转 |
| 8 | 0x85 | Control DTC Setting (控制DTC设置) | 客户端控制服务器内DTC设置 | 点击此处跳转 |
| 9 | 0x86 | Response On Event (基于事件响应) | 客户端请求设置/控制 服务器内的事件机制 | 点击此处跳转 |
| 10 | 0x87 | Link Control (链路控制) | 客户端请求控制通信波特率 | 点击此处跳转 |
2. 数据传输功能单元
| 序号 | ID | 服务 | 说明 | 服务详解 |
|---|---|---|---|---|
| 1 | 0x22 | Read Data By Identifier (按标识符读取数据) | 客户端请求读取通过给定 Data Identifier(数据标识符)所识别的记录的当前值 | 点击此处跳转 |
| 2 | 0x23 | Read Memory By Address (按地址读取内存) | 客户端请求读取给定范围的当前值 | 点击此处跳转 |
| 3 | 0x24 | Read Scaling Data By Identifier (按标识符读取换算数据) | 客户端请求读取通过给定 Data Identifier(数据标识符)所识别的记录的换算信息 | 点击此处跳转 |
| 4 | 0x2A | Read Data By Periodic Identifier (按周期性标识符读取数据) | 客户端请求调度服务器中的数据供周期性传输 | 点击此处跳转 |
| 5 | 0x2C | Dynamically Define Data Identifier (动态定义数据标识符) | 客户端请求动态定义后续可能成为 22 服务所读取的数据标识符 | 点击此处跳转 |
| 6 | 0x2E | Write Data by Identifier (按标识符写数据) | 客户端请求写入通过给定 Data Identifier(数据标识符)所指定的记录 | 点击此处跳转 |
| 7 | 0x3D | Write Memory By Address (受保护的数据传输) | 客户端请求改写给定的内存范围的值 | 点击此处跳转 |
3. 存储数据传输功能单元
| 序号 | ID | 服务 | 说明 | 服务详解 |
|---|---|---|---|---|
| 1 | 0x14 | Clear Diagnostic Information (清除诊断信息) | 允许客户端从服务器中清除诊断信息(包括DTC 和捕获的数据等) | 点击此处跳转 |
| 2 | 0x19 | Read DTC Information (读取诊断信息) | 允许客户端从服务器中请求诊断信息(包括DTC 和捕获的数据等) | 点击此处跳转 |
4. IO 控制功能单元
| 序号 | ID | 服务 | 说明 | 服务详解 |
|---|---|---|---|---|
| 1 | 0x2F | Input Output Control By Identifier (按标识符输入输出控制) | 客户端请求服务器控制特定 输入/输出 | 点击此处跳转 |
5. 例程功能单元
| 序号 | ID | 服务 | 说明 | 服务详解 |
|---|---|---|---|---|
| 1 | 0x31 | Routine Control (例程控制) | 客户端请求启动、停止服务器的例程,或请求例程结果 | 点击此处跳转 |
6. 上传下载功能单元
| 序号 | ID | 服务 | 说明 | 服务详解 |
|---|---|---|---|---|
| 1 | 0x34 | Request Download (请求下载) | 客户端请求从客户端向通过服务器传输数据 | 点击此处跳转 |
| 2 | 0x35 | Request Upload (请求上传) | 客户端请求从服务器向客户端传输数据 | 点击此处跳转 |
| 3 | 0x36 | Transfer Data (传输数据) | 客户端向服务器传输数据(下载)或请求服务器传输数据(上传) | 点击此处跳转 |
| 4 | 0x37 | Request Transfer Exit (请求传输终止) | 客户端请求传输终止 | 点击此处跳转 |
| 5 | 0x38 | Request File Transfer (请求文件传输) | 客户端请求在服务器和客户端之间传输文件 | 点击此处跳转 |
引用与参考
- https://zhuanlan.zhihu.com/p/502441990
- https://blog.csdn.net/weixin_48498880/article/details/126443147
- https://blog.csdn.net/weixin_48498880/article/details/128255219