UDS
本质上是一系列服务的集合,包含6
大类,共26
种。每种服务都有独立的ID
,即SID
。
请求
-
SID(1Byte)
+ 参数 -
SID(1Byte)
+Sub-function(1Byte)
+ 参数 -
SID
+DID(2Bytes)
响应
- 肯定响应
SID+0x40(1Byte)
+Sub-function
(根据请求是否存在) + 参数SID+0x40(1Byte)
+DID
+Data
- 否定响应
0x7F
+SID
+NRC(1Byte)
(否定响应码)0x7F
+SID
+DID
+NRC(1Byte)
(否定响应码)
- 常见的
NRC
11
表示服务不支持12
表示Sub-function
不支持13
表示请求的长度不正确、格式不正确31
表示请求超出范围78
表示收到诊断请求,等待响应7E
表示当前会话下Sub-function
不支持7F
表示当前会话下服务不支持
Sub-function
分成了两部分(14229 P39
)
Bit7
,Suppress postive reponse message indication bit
,抑制正响应位- 为
0
时,不抑制正响应消息 - 为
1
时,抑制响应消息,正响应消息不应该被发送 - 负响应消息不受抑制正响应位影响,会根据协议规定的限制发送
- 注意
NRC为78时
,后续也会发送正响应
- 为
Bit0 - Bit6
Sub-function
的参数值
常用服务
-
10
诊断会话控制01
默认会话:权限最小,可操作的服务少02
编程会话:用于解锁bootloader
相关的诊断服务03
扩展会话:用于解锁高权限诊断服务,如:读写DTC
、写入数据- 注:编程会话不能由默认会话转入(在默认会话情况下,不能执行
10 02
),只能由扩展会话转入 - 默认进入默认会话,当
ECU
处于非默认会话时,一段时间内没有请求会退回到默认会话。可以通过让Tester
周期发送3E
服务,使ECU
保持在非默认会话
-
11
重置ECUReset
- 报文格式
- 请求:
11
+Sub-function
- 响应:
51
+Sub-function
+powerDownTime
- 请求:
- 常用子服务
01
硬重启03
软重启04
enableRapidPowerShutDown
当使用此子服务时,powerDownTime
才会存在
11 01 51 01
- 报文格式
-
27
安全访问ECU
上电后是一个锁定的状态,可以通过27
服务来解锁- 过程:
Tester
端给ECU
发送请求报文来请求种子ECU
收到报文后,回复肯定响应(包含种子数)Tester
端根据这个种子数,利用自身的安全算法算出一个密钥K1
,并发送给ECU
ECU
同样根据种子数和自身的安全算法计算出一个密钥K2
,并将接收到的K1
与K2
相比较。如果一致ECU
发送肯定响应给Tester
端,已经解锁。
- 当执行复位、重新上下电或者会话切换后,会由解锁状态跳转到锁定状态
-
22
读数据- 报文格式
- 请求:
22
+DID(2Bytes)
- 响应:
62
+DID
+Data
- 请求:
- 支持的
NRC
13
表示请求消息的长度无效或超过长度14
表示读取的数据已经超过了传输最大值,如请求多个DID
,响应的数据太多了22
表示服务器的运行条件不满足执行的操作31
表示当前会话下不支持请求的DID
;请求的动态DID
尚未分配33
表示如果至少有一个DID
是安全的,但是服务器没有解锁
- 报文格式
-
2E
写数据- 报文格式
- 请求:
2E
+DID
+Data
- 响应:
6E
+DID
- 请求:
- 支持的
NRC
72
表示写入失败
- 报文格式
-
19
读DTC
-
当系统检测到错误或故障时,会将相应的数值故障码进行存储,数值故障码就是
DTC
。 -
一般由
3
个字节组成:-
字节
1
- 左边两位对应
DTC
属于哪一个系统,P: 00
动力系统、C: 01
底盘、B: 10
车身和U: 11
通信系统 - 左边
3-4
位用来区分DTC
是标准组织所定义还是OEM
自定义 - 左边
5-8
位对应车辆系统的区域
- 左边两位对应
-
DTC Status
Bit4
和Bit6
的初始值为1
,其余位的初始值为0
,所以默认值0x50
Bit0
为1
时表示当前结果为故障Bit3
为1
时表示存在历史故障
-
-
常用子服务(
14229 P188
、14229 P206
)01
:检索与客户端定义的状态掩码匹配的DTC
数量19
+01
+DTCStatusMask
59
+01
+DTCStatusAvailabilityMask
+DTCFormatIdentifier
+Number(2Byte)
02
:检索与客户端定义的状态掩码匹配的DTC
列表19
+02
+DTCStatusMask
59
+02
+DTCStatusAvailabilityMask
+DTC
+statusOfDTC
- 注:当
(DTCStatusMask & statusOfDTC) != 0
时,匹配成功
-
04
:读取DTC
的快照信息(冻结帧),即发生故障时的一些环境数据,能更好的判断DTC
产生的原因以及发生故障的原因
-19
+04
+DTC
+DTCSnapshotRecordNumber
-59
+04
+DTC
+Status
+DTCSnapshotRecordNumber
+DTCSnapshotRecordNumberOfIdentifiers
+DID
+snapshotData
+DID
+snapshotData
- 快照信息:例如故障发生时间、胎压、电压、行驶里程数和车速等。在故障发生时,ECU
要记录发生故障时的快照信息,便于以后通过查找故障发生时刻的这些数据,分析故障原因
-DTCSnapshotRecordNumber
包含一组快照信息、一组快照信息中可以包含多个DID
,每个DID
则包含具体的信息,比如:胎压、里程数06
:读取DTC
存储时候的一些扩展信息19
+06
+DTC
+DTCExtDataRecordNumber
59
+06
+DTC
+statusOfDTC
+DTCExtDataRecordNumber
+DTCExtDataRecord[]
- 扩展信息:用于记录故障的一些其它信息,比如:故障发生的次数、老化次数、已老化次数等
- 为什么有了快照数据还要有扩展信息呢?
- 快照即故障发生时刻存下来的瞬间的环境数据
- 扩展信息即在故障发生时其它的故障信息,如
aging counter
、aged counter
、Fault Counter
以及event id
等
0A
:读取所有DTC
列表及状态19
+0A
59
+0A
+DTCStatusAvailabilityMask
+DTC
+statusOfDTC
-
-
14
清除DTC
-
报文格式
- 请求:
14
+DTC
- 响应:
54
14 FF FF FF 54
- 请求:
-
-
31
例程控制RoutineControl
- 客户端通过例程
ID
(2-Byte
)请求启动、停止服务端的例程或者请求例程结果 - 主要用于:
Erasing memory
、Resetting
- 报文格式
- 请求:
31
+Sub-function
+routineIdentifier(2-Byte)
- 响应:
71
+routineControlType
+routineIdentifier(2-Byte)
+routineInfo
- 请求:
- 常用子服务
01
启动例程(startRoutine
)02
停止例程(stopRoutine
)03
请求例程结果(requestRoutineResults
)
- 客户端通过例程
-
34
请求下载Request Download
- 报文格式
- 请求:
34
+dataFormatIdentifier
+addressAndLengthFormatIdentifier
+memoryAddress
+memorySize
dataFormatIdentifier
00
00
以外的值由汽车制造商定义
addressAndLengthFormatIdentifier
的含义bit 7-4
:Length (number of bytes) of the memorySize parameter
,指定memorySize
有几个字节bit 3-0
:Length (number of bytes) of the memoryAddress parameter
,指定memoryAddress
有几个字节
memoryAddress
要写入数据在内存的起始地址memorySize
使用此参数与实际要传输的数据大小进行比较- 响应:
74
+lengthFormatIdentifier
+maxNumberOfBlockLength
lengthFormatIdentifier
的含义bit 7-4: Length (number of bytes) of the maxNumberOfBlockLength parameter
bit 3-0: reserved by document, to be set to 0
maxNumberOfBlockLength
告知客户端后面的每个TransferData
报文总共占多少字节
- 请求:
34 11 33 60 20 00 00 FF FF 74 20 00 81
- 报文格式
-
36
传输数据Transfer Data
- 将数据从客户端传输到服务器
- 报文格式
- 请求:
36
+blockSequenceCounter
+Data(3-n)
blockSequenceCounter
序号0x01-0xFF
,下一个循环0x00-0xFF
- 响应:
76
+blockSequenceCounter
+transferResponseParameterRecord
- 请求:
36 01 xx xx # 每条报文占的字节数根据34服务中响应的maxNumberOfBlockLength返回值 76 01
-
37
请求传输退出Request Transfer Exit
- 用于终止客户端和服务端之间的数据传输
- 报文格式
- 请求:
37
- 响应:
77
- 请求:
37 77
-
实际传输过程
-
依次
34
、36
和37
,为一个循环,其中36
数据传输可执行多次 -
37
执行结束后,如果还有其它数据传输,则再次执行34
、36
和37
服务
-
-
28
通信控制(CommunicationControl
)- 用于开启或关闭服务端某些消息的接收/发送报文
- 报文格式
- 请求:
28
+sub-function=[controlType]
+communicationType
communicationType
01: normalCommunicationMessages
02: networkManagementCommunicationMessages
03: networkManagementCommunicationMessages and normalCommunicationMessages
- 响应:
68
+sub-function=[controlType]
- 请求:
28 03 02 68 03
- 常用子服务
00
:enableRxAndTx
启用非诊断报文的接收和发送03
:disableRxAndTx
禁止非诊断报文的接收和发送
-
85
控制DTC
(ControlDTCSetting
)- 用于停止和恢复
DTC
状态位的更新 - 报文格式
- 请求:
85
+sub-function=[DTCSettingType]
+DTCSettingControlOptionRecord
- 响应:
C5
+DTCSettingType
- 请求:
85 01 C5 01
-
常用子服务
01
on
恢复更新02
off
停止更新
-
报文格式
- 请求:
85
+sub-function=[DTCSettingType]
+DTCSettingControlOptionRecord
- 响应:
C5
+DTCSettingType
- 请求:
85 01 C5 01
- 常用子服务
01
on
恢复更新02
off
停止更新
- 用于停止和恢复