UDS诊断协议规范与要求

article/2025/10/31 0:33:35

1.UDS简介

1.1标准介绍

国际标准ISO 14229,基于OSI基本模型实现。如下所示:
应用层(第7层),ISO 14229-1,ISO 14229-3 UDSonCAN,ISO 14229-4 UDSonFR,ISO 14229-5 UDSonIP,ISO 14229-6 UDSonK-Line,ISO 14229-7中规定的统一诊断服务UDSonLIN,进一步补充了ISO 27145-3 WWH-OBD。
表示层(第6层),特定车辆制造商,ISO 27145-2 WWH-OBD。
会话层(第5层),在ISO 14229-2中做了描述。
传输层(第4层),在ISO 15765-2 DoCAN中做了描述,包括FlexRay上的ISO 10681-2通信,ISO 13400-2 DoIP,ISO 17987-2 LIN,ISO 27145-4 WWH-OBD。
网络层(第3层), 在ISO 15765-2 DoCAN中做了描述,在FlexRay上的ISO 10681-2通信,ISO 13400-2 DoIP,ISO 17987-2 LIN,ISO 27145-4 WWH-OBD。
数据链路层(第2层),在ISO 11898-1,ISO 11898-2,ISO 17458-2,ISO 13400-3,IEEE 802.3,ISO 14230-2,ISO 17987-3 LIN和其他标准ISO 27145- 4 WWH-OBD中做了描述。
物理层(第1层),在ISO 11898-1,ISO 11898-2,ISO 17458-4,ISO 13400-3,IEEE 802.3,ISO 14230-1,ISO 17987-4 LIN和其他标准ISO 27145-4中对 WWH-OBD做了描述。

ISO 14229由以下部分组成,总标题为道路车辆 - 统一诊断服务(UDS):
第1部分:规范和要求
第2部分:会话层服务
第3部分:CAN实施的统一诊断服务(UDSonCAN)
第4部分:FlexRay实现的统一诊断服务(UDSonFR)
第5部分:Internet协议实施的统一诊断服务(UDSonIP)
第6部分:K线实施的统一诊断服务(UDSonK-Line)
第7部分:本地互联网络实施(UDSonLIN)上的统一诊断服务
第n部分:统一诊断服务在…实施(UDSon …)
其中ISO-14229 包括ISO 14229-1和ISO 14229-2(会话层服务)两部分。
诊断测试仪(客户端)和电子控制单元(ECU,服务器)基于该协议进行通讯。
OSI诊断模型
在这里插入图片描述

1.2使用介绍

1.2.1 常见名词解释

诊断故障码DTC:识别故障状态的数字通用标识码;
永久性DTC:执行DTC清除请求所无法清除的故障信息,存储在非易失性存储器,知道满足特定指令或达到特定标准(如监管);
重新编程软件:部分启动软件允许重新编程ECU;

1.2.2诊断数据类型

常见诊断数据有车速、车门控制、系统状态、镜像位置等。数据类型分类如下所示:

  1. 当前值/实时值;
  2. 存储值,如故障状态下存储的信息;
  3. 静态值,如VIN;

2.诊断报文格式

2.1诊断请求报文

在这里插入图片描述
spr=1,ECU不给出正响应;
spr=0,ECU给出正响应;
目的:告诉ECU是否需要发送响应数据;

2.2诊断应答报文

在这里插入图片描述
正响应报文:

byte1:response service id = service id + 0x40;

负响应报文:

byte1:response service id = 0x7F;
byte2:spr + sub-function = service id;
byte3:NRC,诊断指令执行失败错误码;
eg:7F 22 13 ;7F代表负响应,22代表服务类型,其中13代表请求消息错误。

否定响应码(NRC):

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

会话状态

3.诊断服务类型

3.1服务类型简述

1.诊断与通信管理;
2.数据传输;
3.存储数据传输,用于操作DTC;
4.IO控制;
5.调用ECU内部预置函数;
6.上传与下载;

3.2服务类型详解

3.2.1 诊断与通信管理

3.2.1.1. 0x10 - DiagnosticSessionControl(诊断通信控制)

解释:请求控制与ECU的诊断会话。
格式:0x10|SessionTypeSessionType-请求消息子功能定义:0x00 ISOSAEReserved(保留)0x01 defaultSession(ECU上电后的默认状态)0x02 ProgrammingSession(进行软件刷写相关的服务)用于解锁BootLoader相关的诊断服务,即程序烧写;0x03 extendedDiagnosticSession(诊断启动后接收到10 03转为该状态)用于解锁高权限诊断服务,如写入数据、参数、读写诊断码;0x04 safetySystemDiagnosticSession0x05 – 0x3F ISOSAEReserved(保留)0x40 – 0x5F vehicleManufacturerSpecific(由整车厂自定义使用)0x60 – 0x7E systemSupplierSpecific(由ECU供应商自定义使用)0x7F -  ISOSAEReserved(保留)肯定响应:0x50|SessionType|SessionParameterRecord.......
否定响应:0x12:不支持子功能参数;0x13:消息长度错误;0x22:不满足请求标准/条件;

3.2.1.2. 0x11 - ECUReset

强制对ECU进行重置。
格式:0x11|resetTyperesetType - 请求消息子功能定义0x00:保留;0x01:再次初始化,恢复为上电状态;0x02:模拟断电重置;0x03:软件重置,重新启动应用程序;0x04:进入休眠状态;0x05:禁止启用“快速关闭电源”功能;0x06-0x5F:整车厂商自定义0x7F:保留肯定响应:0x51|resetType(0x00-0x7F)|powerDownTime(0x00-0xFF)powerDownTime:0x00 - 0xFE 254s; 0xFF 表示失败或者时间不可用
否定响应:0x12:不支持子功能参数;0x13:消息长度错误;0x22:不满足请求标准;0x33:ECU未被解锁,请求重置受到了保护;	

3.2.1.3. 0x27 - SecurityAccess

请求解锁安全服务,常用见交互流程:1.客户端请求种子;2.服务端发送种子;3.客户端发送秘钥;4.服务端验证秘钥有效性,进行解锁与应答; 5.服务端清除上电/复位延迟计数器的内部提示信息;备注:1.服务端需要支持延迟计数器,当服务器加电/复位时被锁定时需要延迟,整车厂商选择是否支持延时定时器。2.requestseed参数值应时钟为奇数,相同安全等级的sendkey参数值=requestseed参数值+1。3.任何时候,只有一个安全级别处于活动状态。如requestseed 0x03处于活动状态,Tester端当前与requestseed 0X01安全级别解锁成功,那么Tester只可以与requestseed 0x01关联的安全功能才可以被解锁,requestseed 0x03关联的安全功能将会被关闭(其中安全级别的变编号是任意的)。4.尝试安全性访问时,不应该阻碍汽车的正常通信与其他诊断通讯。5.服务器锁定时请求安全服务,安全服务器应支持拒绝。格式:0x27| requestseed( 0x01/0x03/0x05/0x07-0x7D)| Data.....0x27| sendkey (0x02/0x04/0x06/0x08-0x7E)| Data.....子功能定义:requestseed与sendkey具有一定的固定关系:requestseed = 0x01 -  sendkey = 0x02requestseed = 0x03 - sendkey = 0x04数据参数:securityKey:由算法依据seed生成的;securityAccessDataRecord:传输到服务端的seed信息;肯定响应:0x67| securityAccessType(0x00-0x7F)| Data.....		
否定响应:0x12:不支持功能参数;0x13:消息长度错误;0x22:不满足请求标准;0x24:应该先发送seed数据,而不是先发送key数据;0x31:Data为无效数据;0x35:key比对不成功,校验不通过;0x36:超过最大试错次数;0x37:当前服务器处于延时状态;
展示案例:
1. 服务端(ECU)处于“锁定”状态(1)请求种子requestseed : 0x27|0x01service seed : 0x67|0x01|0x36 0x57(2)发送秘钥sendkey : 0x27|0x02|0xC9 0xA9response  : 0x67|0x02 
2.服务端处于“解锁”状态(1)请求种子requestseed:0x27|0x01service seed:0x67|0x01|0x00 0x00

3.2.1.4. 0x28 - CommunicationControl

打开/关闭某些消息的接收与发送;
格式:0x28| controlType(0x00 - 0xFF)| communicationType(0x00 - 0xFF)| nodeIdentificationNumber......controlType:子功能:0x00:指定的通信类型未启用数据的接收与传输;0x01:应启用消息接收,禁用指定通信类型的数据传输;0x02:应禁用消息接收,启用指定通信类型的数据传输;0x03:应禁用指定通信类型的数据接收与传输;0x04:应将寻址总线主机相关的子总线切换到诊断模式;0x05:应将寻址总线主机相关的子总线切换到程序调度模式;0x06-0x3F:保留;0x40-0x5F:整车厂商自定义;0x60-0x7E:系统供应商自定义;0x7F:保留;communicationType:应用的控制通信类型,允许同时控制多种通信类型。nodeIdentificationNumber:用于识别车辆子网络节点。肯定响应:0x68| controlType(0x00 - 0x7F)		
否定响应:0x12:不支持子功能参数;0x13:消息长度错误;0x22:禁用/启用请求失败(服务器正常模式下使用);0x31:参数错误;展示案例:1.禁用传输网络管理消息请求(当)0x28| 0x01(第7位为0)| 0x02(网络管理)0x68| 0x012.将远程网络地址为0x000A节点连接到仅诊断调度模式0x28| 0x04| 0x01| 0x00 0x0A0x68| 0x043.切换到具有增强地址信息的应用程序调度模式,连接到子网络节点0x000A0x28| 0x05| 0x01 0x00 0x0A0x68| 0x05

3.2.1.5. 0x3E - TesterPresent

使ECU保持连接状态,并将已机会的诊断服务或者通信保持现有状态。可防止服务端恢复为默认状态。
格式:0x3E| subFunction(0x00-0x80)
subFunction:0x00:不支持suppressPosRspMsgIndicationBit子函数值;	0x01 - 0x7F:值保留;肯定响应:0X7E| 0X00
否定响应:0x12:不支持子功能参数;0x13:消息长度错误;展示案例:1.请求消息流程案例0x3E| 0x000x7E| 0x002.可定响应消息流程0x3E| 0x80无响应由服务器发送

3.2.1.6. 0x83 - AccessTimingParameter

读取/修改活动通信时间参数,此功能取决于ECU能力支持和数据链路拓扑结构。每个争端会话只支持一个扩展时序参数集。因ECU支持的时序参数集不用,通常仅考虑用于物理寻址。
改服务提供四种模式:1.扩展时间参数设置;2.默认时间参数设置;3.当前时间参数获取;4.指定时间参数设置;
格式:0x83| timingParameterAccessType(0x00 - 0xFF)| timingparameterrequestRecord......timingParameterAccessType:0x00:保留;0x01:读取服务端扩展时序参数集(当前服务器支持值);0x02:更改服务端所有定时参数为默认值;0x03:读取当前使用的定时参数;0x04:更改定时参数值;0x05 - 0xFF:保留;肯定响应:0xC3| 0x00-0x7F| Data .....
否定响应:0x12:不支持子功能参数;0x13:消息长度或格式错误;0x22:条件不满足;0x31:无效参数;展示案例:1. 时序参数设置为默认值0x83| 0x02 0xC3|0x02

3.2.1.7. 0x84 - SecuredDataTransmission

执行扩展数据链接安全性数据传输;
常见诊断服务数据传输方法:1.不安全的数据传输模式2.安全的数据传输模式注:如下服务不可在安全模式下执行:a.0x86/0x2A/0x3E
格式:0x84| Data.....肯定响应:0xC4| Data.....
否定响应:0x13:数据长度错误;0x38 - 0x4F:保留;

3.2.1.8. 0x85 - ControlDTCSetting

控制(开关)ECU中DTC状态位存储;
格式:	0x85| Data.....DTCSettingType:0x00:保留;0x01:请先恢复更新诊断故障码状态位;0x03-0x3F:保留;0x40-0x5F:整车厂商自定义;0x60-0x7E:系统供应商自定义;0x7F:保留;肯定响应:0xC5| 0x00 - 0x7F
否定响应:0x12:不支持子功能参数;0x13:消息长度或格式错误;0x22:条件不满足;0x31:无效参数;展示案例:
1.请求消息流程1.00x85| 0x020xC5| 0X02
2.请求消息流程2.00x85| 0x010xC5| 0x01

3.2.1.9. 0x86 - ResponseOnEvent

命令ECU自主上报DTC及相关的环境数据,关闭也是使用该指令(一般用于开发前期)。
注:1.该服务可以在任何会话中设置与激活;2.当诊断服务正在执行任务时,将会被推迟执行;3.多个事件发生一个事件正执行,多个事件处理应整车厂商定义事件;4.当事件将被执行时,服务器应执行对应响应服务中包含的服务;5.该服务启动后,服务器将会对客户端做出响应,知道服务结束;6.移动非默认控制通信会话时,应先请求停止该服务。在返回默认状态下处于活动状态下的所有该服务应该被重新激活;7.多个该服务可以与不同的需求同时启动和停止诊断服务;8.设置该服务应适用如下内容:a.若eventtype第六位为0(不存储事件),服务断电时,应终止服务器进行复位;b..若eventtype第六位为1(存储事件),应根据服务器重新启动并继续执行;9.抑制响应位打开后,客户端将用于控制该服务的停止、启动、清除;10.若设置有限窗口时间过时,将有最终响应,若有限时间窗口结束前ROE被停止,则不发送最终响应;11.为使得各响应之间更好的隔离,该服务更适合应用于瞬时状态时间。每次时间都有对应的响应。
格式:0x86| eventType(0x00-0xFF)| eventWindowTime...| serviceToRespondToRecord .....eventType(功能位6):0x000x01
子功能参数:0x00:停止服务端继续发送响应;0x01:检测到当前任务匹配的新的DTC;0x02:定时器中断;0x03:将事件表示为新的内部数据记录;0x04:在肯定响应中的所有事件都已经报告在服务端使用;0x05:激活服务端;0x06:清除服务端设置逻辑;0x07:***0x08-0x1F:保留;0x20-0x02F:整车厂商自定义;0x30-0x3E:系统供应商自定义;0x3F:保留;肯定响应:0xC6| eventType(0x00-0x7F)| numberOfIdentifiedEvents(0x00 - 0xFF ....)|响应附加参数| 服务请求响应所需附加服务参数
否定响应:0x12:不支持子功能参数;0x13:消息长度或格式错误;0x22:条件不满足;0x31:事件类型参数错误、事件窗口时间无效、DID不支持、有限事件窗口与存储状态为请求事件;展示案例:1.请求消息流程示例1.00x86| 0x01| 0x08| 0x01| 0x19 0x01 0x010xC6| 0x01| 0x00| 0x08| 0x01(testFailed)| 0x19 0x01 0x012.请求消息流程示例2.00x86| 0x05| 0x080xC6| 0x01| 0x00| 0x083.请求消息流程示例3.00x86| 0x05| 0x080xC6| 0x01| 0x00| 0x08readDTCInformation:更多查看P128

3.2.1.10. 0x87 - LinkControl

调整ECU数据链路层和物理层状态,如控制通信波特率(带宽),调整步骤:1.客户端验证是否可以执行转换;2.客户发送执行请求;(1) 判断ECU是否支持将要调整的目标波特率;(2) 让ECU数据链路层和物理层转到目标波特率的通信状态;
格式:0x87| linkControlType(0x01)| linkControlModeldentifier(0x00 - 0xFF) 子功能参数:0x00:保留;0x01:验证是否可以执行指定预定义参数的转换;0x02:验证是否可以执行特定定义参数转换;0x03:请求服务端将数据链路转换为当前验证信息中的请求模式;0x04-0x3F:保留;0x40-0x5F:整车厂商自定义;0x60-0x7E:系统供应商自定义;0x7F:保留;肯定响应:0xC7| 0x00 - 0x7Ff否定响应:0x12:不支持子功能参数;0x13:消息长度或格式错误;0x22:条件不满足;0x24:0x31:参数错误;展示案例:1.请求格式:0x87| 0x02| Data....2.请求格式:0x87| 0x033.设置波特率0x87| 0x01| 0x05(115200kBit/s)0xC7| 0x01转换波特率0x87| 0x83无响应应答4.转换波特率为特定值0x87| 0x02| 0x02 0x49 0xF0 (249F0 - 150000)0xC7| 0x02	转换波特率0x87| 0x83无响应应答5.验证是否满足转换条件0x87| 0x01| 0x200xC7| 0x01转换到编程调度器0x87| 0x83		

3.2.2 数据传输单元

3.2.2.1. 0x22 - ReadDataByIdentifier

客户端请求包含一个或者多个字节的诊断数据,用于表示服务器维护记录。数据的格式由整车制造商或系统供应商定义。
格式:0x22| dataIdentifier(0x00-0xFF...) |......肯定响应:0x62| dataIdentifier(0x00-0xFF...)|.......
否定响应:0x13:消息长度或格式错误;0x14:0x22:条件不满足;0x31:参数错误;0x33:安全校验未通过;展示案例:1.读取VIN码数据0x22| 0xF1 0x900x62| 0xF1 0x90| 0x57 0x30 0x4C 0x30 0x30 0x30 0x30 0x34 0x33 0x4D 0x42 0x35 0x34 0x31 0x33 0x32 0x362.读取多个数据(0x010A和0x0110)0x22| 0x01 0x0A| 0x01 0x10 0x62| 0x01 0x0A| 0xA6 	* * * * * *  * * * | 0X01(MSB) 0X10(LSB)| 0x8C

3.2.2.2. 0x23 - ReadMemoryByAddress

允许客户通过提供起始地址和读取内存大小向服务器请求内存数据。
格式:0x23| addressAndLengthFormatIdentifier(0x00-0xFF)| 起始地址参数| 内存大小参数
肯定响应:0x63| dataRecord (0x00=0xFF).......
否定响应:0x13:消息长度或格式错误;0x22:条件不满足;0x31:参数错误;0x33:服务器被锁定;展示案例:1.4字节寻址(从0x2048 1392地址开始读取4字节)0x23| 0x24| 0x20 0x48 0x13 0x92| 0x01 0x030x63| 0x00 ..... 0x8C(260个字节长度)2.2字节寻址(从0x4813地址开始读取2字节)0x23| 0x12| 0x48 0x13 0x050x63| 0x43 0x2A 0x07 0x2A 0x553.3字节寻址0x23| 0x23| 0x20 0x48 0x13| 0x00 0x030x63| 0x00 0x01 0x8C

3.2.2.3. 0x24 - ReadScalingDataByIdentifier

请求数据信息。
格式:0x24| Data .....肯定响应:0x64| dataidentifier(0x00 MSB|0x00 LSB)|scalingByte(0x00)| scalingByteExtension(0X00 ....)| scalingByte(0x00)| scalingByteExtension(0X00 ....)
否定响应:0x13:参数长度错误;0x22:服务不支持;0x31:请求不支持;0x33:安全检查未通过;展示案例:1.请求消息流程示例0x24| 0xF1 0x900x64| 0xF1 0x90 | 0x6F | 0X622.请求车速(0x0105)0x24|  0x01 0x050x64| 0x01 0x05| 0x01(无符号数字,1byte)| 0x95(公式,5byte)| 0x00(公式标识符) 0xE0 0x4B(c0=75*10p-2p) 0X00 0X1E(c1=30*10p0p)| 0xA1(单位,1byte)| 0x30(unit id,km/h)车速=(0.75*x + 30)km/h3.请求数据(0x0967)示例数据定义见表1710x24| 0x09 0x670x64| 0x09 0x67| 0x22(2个数据字节)| 0x03 0x43					

在这里插入图片描述

3.2.2.4. 0x2A - ReadDataByPeriodicIdentifier

请求服务端周期性传输数据。
格式:0x2A| TransmissionMode(0x0000xFF)| Data .....
肯定响应:0x6A定期数据响应:periodicDataIdentifier (0x00-0xFF)| Data.....
否定响应:0x13:参数长度错误;0x22:条件不满足;0x31:请求不支持;0x33:安全检查未通过;展示案例:1.读取0xE3 0x24数据E3包含冷却液温度、节气门温度、发动机转速、车速传感器;0x24包含电池正极电压、气管绝对值眼里、质量控制流量、车辆气压、负载值;发出数据传输请求:0x2A| 0x02| 0xE3| 0x240x6A0xE3| 0xA6 0x66 0x07 0x50 0x000x24| 0x8C 0x20 0x1A 0x63 0x4A发出数据停止传输请求:0x2A| 0x04| 0xE30x6A		

3.2.2.5. 0x2C - DynamicallyDefineDataIdentifier

通过内存地址和内存大小,在服务端定义一个数据标识。
格式:1.difinitionType=defineByIdentifier(0x01)0x2C| 0x01| difinitionType(0x00)| dynamicDefinedDataIdentifier(MSB(0xF2/0xF3) LSB(0x00))| sourceDataIdentifier(MSB(0X00) LSB(0X00))| positioninSourceDataRecord(0x00)| mqmorySize(0x00)| .....2.difinitionType=defineByMemoryAddress(0x02)0x2C| 0x02| dynamicDefinedDataIdentifier(MSB(0xF2/0xF3) LSB(0x00))| addressAndLengthFormatIdentifier(0x00)| memoryAddress...| memorySize ....| ....3.difinitionType=clearDynamicallyDefinedDataIdentifier(0x03)0x2C| 0X03| dynamicDefinedDataIdentifier(MSB(0xF2/0xF3) LSB(0x00))4.	difinitionType=0X00保留5.	0x00-0x7F保留
肯定响应:0x6C| difinitionType(0x00-0x7F)| dynamicDefinedDataIdentifier(MSB(0xF2/0xF3) LSB(0x00))
否定响应:0x12:子功能不支持;0x13:消息长度或格式错误;0x22:条件不满足;0x31:参数错误;0x33:安全校验不通过;展示案例:见UDS翻译文档P2131.生成单个数据信息(2字节标识符)0x22| 0xF3 0x010x6C| 0xF3 0x01| 0x4C 0X36 0X4D 0x49 0x21 0x00 0x17	2.生成多个数据信息的组合数据块0x2C| 0x01| 0xF3 0x02| 0x01 0x0A| 0x02(发动机冷却液温度)| 0x01| 0x01 0x0A| 0x04(发动机转速)| 0x02| 0x01 0x0A| 0x0B(怠速空气控制)| 0x01| 0x05 0x0B| 0x02(爆震传感器)| 0x010x6C| 0x01| 0xF3 0X02-----请求消息0x22| 0xF3 0x020X6C| 0xF3 0x02| 0xA6 0x07 0x50 0x82 0x913.发送依据内存地址构建的数据标识符的数据请求(动态数据请求)0x2C| 0x02 0xF3 0x02| 0x14| 0x21 0x09(发动机温度)| 0x19 0x69| 0x01| 0x21 0x09 0x19 0x6B(发动机转速)| 0x02| 0x013 0x10 0x19 0x95(爆震传感器)| 0x010x6C| 0x02| 0xF3 0x02------请求消息0x22| 0xF3 0x020X6C| 0xF3 0x02| 0xA6 0x07 0x50 0x914.动态构建数据标识符,并依据标识符请求服务端定期发送数据生成包含发动机冷却液0x010A、发动机转速0x010A、保准传感器0x050B的动态数据标识符0xF2E7。0x2C| 0x01| 0xF2 0xE7| 0x01 0x0A| 0x02(发动机冷却温度)| 0x01 0x0A| 0x04(发动机转速)| 0x02| 0x05 0x0B| 0x02(震爆传感器)| 0x010x6C| 0x01| 0xF2 0xE7------请求消息0x2A| 0x04| 0xE70x6A| 0xE7| 0xA6 0x07 0x50 0x91 0xE7| 0xA6 0x07 0x55 0x98(周期性发送数据)5.删除动态定义的数据标识符请求清除0xF303消息0x2C| 0x03| 0xF3 0x030x6C| 0x03| 0xF3 0x036.使用两种定义类型建立一个动态数据标识符a.发动机油温和环境空气温度2字节DID引用;b.内存地址引用的发动机冷却液温度和发动机转速;c.发动机油位由2字节DID引用;0x2c| 0x01| 0xF3 0x01| 0x12 0x34(发动机油温)| 0x01 0x02| 0x56 0x78(环境空气温度)| 0x01| 0x010x6C| 0x01| 0xF3 0x01-----0x2C| 0x02| 0xF3 0x01| 0x14| 0x21 0x09 0x19 0x69| 0x01(发动机冷却液温度)| 0x21 0x09 0x19 0x6B(发动机转速)| 0x020x6C| 0x02| 0xF3 0x01------0x2C| 0x01| 0xF3 0x01| 0x9A 0xBC(发动机油位)| 0x01| 0x040x6C| 0x01| 0xF3 0x01-------0x22| 0xF3 0x010x62| 0xF3 0x01| 0x4C 0x36 0x4D 0xA6 0x07 0x50 0x49 0x21 0x00 0x17------0x2C| 0x03| 0xF3 0x010x6C| 0x03| 0xF3 0x01

3.2.2.6. 0x2E - WriteDataByIdentifier

客户端向指定内存地址写入数据,如配置信息VIM码写入、清除非易失性存储器数据、重置参数、设置选项等。
格式:0x2E| 0x00 0x00(地址)| 0x00 0x00(数据)......肯定响应: 0x6E| 0x00 0x00(响应的2字节数据)
否定响应:0x130x220x310x72:写入内存错误;
展示按理:0x2E| 0xF1 0x90| 00x57 0x30 0x4C 0x30 0x30 0x30 0x30 0x34 0x33 0x4D 0x42 0x35 0x34 0x31 0x33 0x32 0x36 0x6E| 0xF1 0x90

3.2.2.7. 0x3D - WriteMemoryByAddress

允许客户端在一个或多个连续内存位置将信息写入服务器,如清除存储器数据、修改校验值。
格式:0x3D| addressAndLengthFormatIdenfitier(0x00)| 0x00 0x00.......| 0x00 0x00 ......| 0x00 0x00 
肯定响应:0x7D| 0x00| 0x00 0x00 ......| 0x00 0x00 .....
否定响应:0x13:消息长度或格式错误;0x22:条件不满足;0x31:参数错误;0x33:安全校验不通过;0x72:擦除或刷写内存时发生错误;
展示案例:1.将数据字节写入服务内存(2字节寻址)0x3D| 0x12| 0x20 0x48(memoryAddress)| 0x02(memorySize)| 0x00 0x8C0x7D| 0x12| 0x20 0x48| 0x022.将数据字节写入服务内存(3字节寻址)0x3D| 0X13| 0x20 0x48 0x13| 0x03| 0x00 0x01 0x8C0x7D| 0x13| 0x20 0x48 0x13| 0x033.’将数据字节写入服务内存(4字节寻址)0x3D| 0x14| 0x20 0x48 0x13 0x13 0x09| 0x05| 0x00 0x01 0x8C 0x09 0xAF0x7D| 0x14| 0x20 0x48 0x13 0x09| 0x05

3.2.3 存储数据传输单元

3.2.3.1.0x14 - ClearDiagnoticInformation

允许客户端清除服务端诊断信息。
可通过该服务重置/清除DTC信息,如DTC状态信息、DTC快照数据、DTC扩展数据、DTC其他相关数据。
格式:0x14| 0x00 0x00 0x00注意:0XFF 0XFF 0XFF时,代表所有种类的DTC肯定响应:0x54
否定响应:0x13:消息长度或格式错误;0x22:条件错误;0x31:参数错误;0x72:擦除或刷写内存时发生错误;展示案例:1.请求排放系统信息0x14| 0xFF 0xFF 0x330x54		

3.2.3.2.0x19 - ReadDTCInformatioon

允许客户端向服务端请求各种诊断信息。
检索与客户定义的DTC数量、DTC列表、特定功能DTX列表、永久性状态的DTC、冻结帧、DTC计数器信息、DTC发生器、DTC老化计数器、OBD特定计数器(如无故障模式下的架势循环次数)、最后发生时间、测试失败计数器、未完成计数器、客户定义严重性的DTC列表、客户定义严重性的DTC信息、服务器支持DTC状态、失败的第一个DTC、最近失败的DTC、确认的第一个DTC、最近确认的DTC、DTC镜像内存中与客户定义DTC状态码匹配的DTC了列表、DTC镜像内存中检索DTC掩码和DTC扩展数据、DTC镜像内存中检索DTC数量、检索特定信息的DTC数据或相关信息、检索目前为“待定”、“已确认”的DTC类型、从DTC内存中检索客户定义的关联数据、从客户定义DTC存储器中检索匹配列表、用户定义DTC镜像内存中检索DTC列表和扩展数据、DTC内存中检索快照数据确定请求所属类型等
0x01 - 检索与客户端定义状态掩码相匹配的DTC数量
0x02 - 检索与客户端定义状态掩码相匹配的DTC列表
0x03 - 检索DTC快照记录标识
0x04 - 检索客户端定义DTC掩码的快照数据
0x05 -  检索客户端定义记录号的DTC存储数据
0x06 -  检索客户端定的DTC掩码和扩展数据记录号的扩展数据
0x07 -  检索与客户端定义严重性质掩码匹配的DTC数量
0x08 - 检索与客户机定义严重性掩码记录匹配信息的严重性和功能单元信息列表
0x09 - 检索客户定义的DTC严重程度和功能单元信息
0x0A - 检索服务器支持的DTC状态
0x0C - 检索第一个/最近的确认DTC
0x0D - 检索第一个/最近的故障DTC
0x0E - 要求ECU上报最近的一条被置为confirm的DTC
0x0F - 从服务端DTC镜像内存中检索与客户端定义状态掩码匹配的DTC列表
0x10 - 检索镜像内存DCE中客户定义的DTC掩码和DTC扩展数据记录编号的数据记录
0x11 - 检索与客户端定义状态掩码匹配的镜像内存DTC数量
0x12 - 检索与客户端定义状态掩码匹配的“唯一与排放相关的OBD”的DTC数量
0x13 - 检索与客户端定义状态掩码匹配的“唯一与排放相关的OBD”的DTC列表
0x14 - 检索“预先故障” 的DTC状态列表
0x15 - 检索具有“永久性DTC”状态的DTC列表
0x16 - 检索客户端定义DTC扩展数据记录号的DTC扩展数据
0x17 - 检索服务端用户定义DTC存储区中与客户端定义DTC状态掩码匹配的DTC列表
0x18 - 检索服务端用户定义存储器中的DTC快照数据(用于客户端定义的DTC掩码和DTC快照编号)
0x19 - 检索与客户端用户定义内存的DTC扩展数据(用于客户机定义DTC掩码和客户机定义DCE中的DTC扩展数据编号)
0x1A-0x41:保留
0x42 - 检索与客户端定义状态掩码匹配的WWH-OBD DTC列表
0x43-0x54:保留
0x55 - 检索具有“永久性”状态的WWH-OBD DTC列表
0x56-0x7F:保留格式:
1.请求定义子功能信息0x19| 0x01 0x02 0x0F 0x11 0x12 0x13| DTCStatusMask(0x00)
2.请求定义子功能信息0x19| 0x03 0x04| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)| DTCSnapshotRecordNumber(0x00)
3.请求DTC存储数据0x19| 0x05| DTCSnapshotRecordNumber(0x00)
4.请求DTC扩展数据0x19| 0x06 0x10|  DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)| DTCExtDataRecordNumber(0x00)
5.请求DTC严重性掩码和信息0x19| 0x07 0x08| DTCSeverityMask(0x00) DTCStatusMask(0x00)
6.请求DTC严重信息0x19| 0x09| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)
7.请求特定DTC信息0x19| 0x0A 0x0B 0x0C 0x0D 0x0E 0x14 0x15
8.按记录编号请求DTC信息0x19| 0x16| DTCExtDataRecordNumber(0x00)
9.通过任务状态请求用户定义内存DTC信息0x19| 0x17| DTCStatusMask(0x00) MemorySelection(0x00)
10.通过DTC编号请求用户定义内存快照数据0x19| 0x18| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)| DTCSnapshotRecordNumber(0x00)| MemorySelection(0x00)
11.通过DTC编号请求用户定义内存扩展数据0x19| 0x19| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)| DTCExtDataRecordNumber(0x00)| MemorySelection(0x00)
12.通过任务记录请求WWHOBD信息0x19| 0x42| FunctionalGroupIdentifier(0x00)| DTCStatusMask(0x00) DTCSeverityMask(0x00)
13.请求WWHOBD参数状态0x19| 0x55| FunctionalGroupIdentifier(0x00)肯定响应:0x59| 0x01 0x07 0x11 0x12| DTCStatusAvailabilityMask(0x00)| 0x00 0x01 0x02 0x03 0x04| DTCCount(0x00 0x00)0x59| 0x02 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x13 0x15| DTCStatusAvailabilityMask(0x00)|Data .....0x59| 0x03| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)| DTCSnapshotRecordNumber(0x00)| ... |...|...0x59| 0x04| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00)| DTCSnapshotRecordNumber(0x00)| DTCSnapshotRecordNumberOfIdentifiers(0x00)| ...| ...| ...0x59| 0x05| DTCStoredDataRecordNumber(0x00)| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00) statusOfDTC(0x00)| DTCStoredDataRecordNumberOfIdentifiers(0x00)| ...| ...0x59| 0x06 0x10| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00) statusOfDTC(0x00)| DTCExtDataRecordNumber(0x00)| ...| ...0x59| 0x08 0x09| DTCStatusAvailabilityMask(0x00)| ...0x59| 0x14| ...0x59| 0x16| DTCExtDataRecordNumber(0x00)| ...| ...0x59| 0x17| MemorySelection(0x00)| DTCStatusAvailabilityMask(0x00)| ...| ...0x59| 0x18| MemorySelection(0x00)| 0x00 0x00 x00 0x00| DTCSnapshotRecordNumber(0x00)| DTCSnapshotRecordNumberOfIdentifiers(0x00)| ...| ...0x59| 0x19| MemorySelection(0x00)| DTCHighByte(0x00) DTCMiddleByte(0x00) DTCLowByte(0x00) statusOfDTC(0x00)| DTCExtDataRecordNumber(0x00)| ...| ...0x59| 0x42| FunctionalGroupIdentifier(0x00)| DTCStatusAvailabilityMask(0x00)| DTCSeverityAvailabilityMask(0x00)| DTCFormatIdentifier(0x04 0x02)| ...0x59| 0x55| FunctionalGroupIdentifier(0x00)| DTCStatusAvailabilityMask(0x00)|  DTCFormatIdentifier(0x04 0x02)| ...
否定响应:0x12:不支持此功能参数;0x13:消息长度错误;0x31:无法识别的DTXMaskRecord、无效的counter/DTCSnapshotRecordNumber、无法识别的FunctionalGroupIdentifier、无法识别的MemorySelection。注意:1.DTCStatusMask/DTCSeverityMask解析与定义7~5:DTC严重性信息(可选)7:是否立即检查,0-否,1-是6:是否在下次停车时检查车辆故障,0-否,1-是5:是否将故障请求仅维护,0-无维护,1-有维护4~0:DTC类别信息2.DTCFormatIdentifier0x00 - 标识参考ISO 15031-6中定义的DTC格式0x01 - 依据DTCAndStatusRecord标识服务器报告DTC格式0x02 - 标识参考SAE J1939-73中定义的DTC格式0x03 - 标识参考SAE J11992-4中定义的DTC格式0x04 -标识参考ISO 27145-2中定义的DTC格式0x05-0xFF:保留3.FunctionalGroupIdentifier作用:a.用于请求UDS版本号来识别协议b.请求车辆DTC状态信息c.清除车辆DTC信息定义:0x00 - 0x32:保留0x33:排放系统组0x34-0xCF:ISO/SAE保留使用0xD0:安全系统组0xD1-0xDF:立法只读组0xE0-0xFD:ISO/SAE保留使用0xFE:VOBD系统0xFF:所有系统组展示案例:1.离合位置传感器-对地短路0x080511,DTC为0x24;2.混合电池温度传感-电路电压高于阈值0x0A9B17,DTC为0x26;3.间歇电路0x25221F,0x2F;4.请求状态掩码为0x08的数据信息0x19| 0x01| 0x080x59| 0x01| 0x2F| 0x01| 0x00 0x015.请求与状态掩码匹配的信息0x19| 0x02| 0x840x59| 0x02| 0x7F| 0x0A 0x9B 0x17 0x24| 0x08 0x05 0x11 0x2F---0x19| 0x02| 0x010x59| 0x02| 0x7F---6.返回三个快照数据0x19| 0x030x59| 0x03| 0x12 0x34 0x56 0x01| 0x12 0x34 0x56 0x02| 0x7 0x9A 0xBC 0x01发动机冷却液温度:0xA6 0x66 0x07 0x50 0x207.返回一个快照数据			0x19| 0x04 | 0x12 0x34 0x56| 0x020x59| 0x04| 0x12 0x34 0x56 0x24| 0x02| 0x01| 0x47 0x11| 0xA6 0x66 0x07 0x50 0x20			8.返回DTC存储数据0x19| 0x05| 0x020x59| 0x05| 0x02| 0x12 0x34 0x56 0x24 0x01| 0x47 0x11| 0xA6 0x66 0x07 0x50 0x209.返回DTC扩展数据编号预热循环计数器-0x05->0x17DTC故障检测计数器-0x10->0x790x19| 0x06|0x12 0x34 0x56| 0xFF0x59| 0x06| 0x12 0x34 0x56 0x24| 0x05| 0x17| 0x10| 0x7910.报告所有的DTC扩展记录0x19| 0x06| 0x12 0x34 0x56| 0xFF0x59| 0x06| 0x12 0x34 0x56 0x24| 0x05| 0x17| 0x10| 0x7911.P314(其他案例此处暂时省略)

3.2.4 输入输出控制单元

3.2.4.1.0x2F - InputOutputControlByIdentifier

用于简单的输入替换输出控制。
格式:0x2F| 0x00 0x00| 0x00 0x00 ...| 0x00 0x00 ...
肯定响应:0x6F| 0x00 0x00| 0x00 0x00 ...
否定响应:0x13:长度错误;0x22:条件不满足;0x31:参数无效;0x33:安全检查未通过;注意:InputOutputControlParameter0x00:结束控制0x01:将所有输入信号、内部参数、输出信号重置为默认状态0x02:请求冻结输入信号的当前状态0x03:将RAM中dataIdentifier引用的输入信号、内部参数、受控输出信号调整为控制选项中包含的值0x04-0xFF:保留展示案例:1.读取进气门位置的当前状态、数据查询状态:0x22| 0x9B 0x00(进气门位置)0x62| 0x9B 0x00| 0x0A(当前位置为10%)---获取数据:0x2F| 0x9B 0x00| 0x03 0x3C(调整到60%)0X6F| 0x9B 0x00| 0x03 0x0C(当前位置12%)---查询状态:0x22| 0x8B 0x000x62| 0x9B 0x00| 0x3C(60->60%,说明当前位置已到了60%)---查询数据:0x2F| 0x9B 0x00| 0x000X6F| 0x9B 0x00| 0x00| 0x3A(接收请求,58->58%,说明当前位置已到了58%)---0x2F| 0x9B 0x00| 0x020X6F| 0x9B 0x00| 0x02 0x32(50%)2.仅控制IAC Pintle位置0x2F| 0x01 0x55| 0x03 0x07 0x0XX 0xXX 0xYZ 0xXX| 0x800x6F| 0x01 0x55| 0x03 0x07 0x02 0xEE 0x12 0x59	---仅控制RPM0x2F| 0x01 0x55| 0x03 0xXX 0x03 0xE8 0xYZ 0xXX| 0x400x6F| 0x01 0x55| 0x03 0x09 0x03 0xB6 0x12 0x59---控制踏板位置A和EGR占空比0x2F| 0x01 0x55| 0x03 0xXX 0xXX 0xXX 0x3Z 0x72| 0x280x6F| 0x01 0x55| 0x03 0x07 0x03 0x52 0x32 0x69---将所有参数的控制返回给ECU0x2F| 0x01 0x55| 0x00| 0xFF0x6F| 0x01 0x55| 0x00 0x09 0x03 0x52 0x12 0x59

3.2.4 常规功能单元

3.2.4.1.0x31 - RoutineControl

执行已定义的步骤序列并获取任何相关结果。如内存擦除、重置、学习自适应数据、运行内检、覆盖正常服务器控制决策、控制服务值随时间变化等。
常见步骤:1.开始一个历程;2.停止一个历程;3.请求例行结果;
格式:0x31| routineControlType(0x00)| routineIdentifier(0x00 0x00)| routineControlOptionRecord(0x00 ... 0x00)子函数参数:0x00:保留;0x01:启动指定历程;0x02:停止指定历程;0x03:返回指定历程结果值;0x04-0x7F:保留;肯定响应:0x71| 0x00-0x7F| 0x00 0x00| 0x00| 0x00 0x00 ...
否定响应:0x12:子功能不支持;0x13:消息长度错误;0x22:未按标准进行请求;0x24:未在正常状态下执行操作;0x31:参数错误;0x33:安全访问被拒绝;0x72:在访问服务段内部存储器例程时检测到错误;注意:routineIdentifier - RID0x0000-0x00FF:保留;0x0100-0x01FF:保留,用于表示行驶记录仪测试结果;0x0200-0xDFFF:保留,整车制造商自定义;0xE000-0xE1FF:保留,用于用于表示OBD/EOBD;0xE200:启动先前选择的点火回路的部署;0xE201-0xE2FF:保留,用于安全系统实现;0xE300-0xEFFF:保留;0xF000-0xFEFF:保留,系统供应商自定义;0xFF00:用于启动服务端内存擦除;0xFF01:用于检查服务端内存编程依赖;0xFF02:用于擦除服务端镜像内存DTC;0xFF03-0xFFFF:保留;		展示案例:1.基于测试条件:已点火、未打开发动机、速度为0进行测试,进行启动测试。0x31| 0x01| 0x02 0x010x71| 0x01| 0x02 0x01 0x322.基于测试条件:已点火、未打开发动机、速度为0进行测试,进行停止测试。0x31| 0x02| 0x02 0x010x71| 0x02| 0x02 0x01 0x303.检测结果值0x31| 0x03| 0x02 0x010x71| 0x03| 0x02 0x01 0x30 0x33 ... 0x8F4.在规定条件下,启动例程0x31| 0x01| 0x02 0x02| 0x06 0x010x71| 0x01|0x02 0x02| 0x32 0x33 ....0x8F

3.2.5 下载上传功能单元

3.2.5.1.0x34 - RequestDownload

格式:0x34| dataFormatIdentifier(0x00)| addressAndLengthFormatIdentifier(0x00)| 0x00 0x00 ...| 0x00 0x00 ...
肯定响应:0x74| LengthFormatIdentifier(0x00)| 0x00 0x00 ...
否定响应:0x13:消息长度错误;0x22:服务端与客户端之间的数据大小不匹配;0x31:参数无效;0x33:安全校验失败;0x70:下载到服务端内存失败;

3.2.5.2.0x35 - RequestUpload

从服务端到客户端进行数据传输。
格式:0x35| dataFormIdentifier(0x00)| addressAndLengthFormatIdentifier(0x00)| 0x00 ... 0x00| 0x00 ... 0x00肯定响应:0x75| LengthFormatIdentifier(0x00)| maxNumberOfBlockLength(0x00 ... 0x00)
否定响应:0x13:消息长度错误;0x22:服务端与客户端之间的数据大小不匹配;0x31:参数无效;0x33:安全校验失败;0x70:下载到服务端内存失败;

3.2.5.3.0x36 - TransferData

用于服务端与客户端之间的数据传输。
格式:0x36| blockSequenceCounter(0x00)| 0x00 ... 0x00肯定响应:0x76| 0x00| 0x00 ... 0x00
否定响应:0x13:消息长度错误;0x24:请求错误(带有blockSequenceCounter的该传输服务请求消息必须等于前一个请求传输消息中包含的请求消息);0x31:不符合规范的请求;0x71:下载模块长度与服务端给的内存大小不符合;0x72:服务端下载数据时数据被擦除;0x73:blockSequenceCounter错误;0x92/0x93:服务端主电源应交测量电压超出了将数据下载到服务器的可接受范围;

3.2.5.4.0x37 - RequestTransferExit

终止客户端与服务端之间的数据传输。
格式:0x37|transferRequestParameterRecord(0x00 .. 0x00)肯定响应:0x77| transferResponsetParameterRecord(0x00 .. 0x00)
否定响应:0x13:消息长度错误;0x24:收到请求时编程过程未完成;传输服务已停止;0x31:无效数据;0x72:服务端下载数据时数据被擦除;展示案例:1.客户端从服务端下载数据。memoryaddress 0x602000dataFormatIdentifier:0x11memorySize:0x00FFFFtransferResponseParameter:0x0081---请求下载:0x34| 0x11| 0x33| 0x60 0x20 0x00| 0x00 0xFF 0xFF0x74| 0x20| 0x00 0x81---传输数据:0x36| 0x01| 0x00 ...0x000x76| 0x010x36| 0x05| 0xXX  ...0xXX0x76 0x05		---移除出口(停止传输):0x370x771.客户端向服务端上传数据。memoryaddress 0x201000dataFormatIdentifier:0x11memorySize:0x0001FFtransferResponseParameter:0x0081---请求上传:0x35| 0x11| 0x33| 0x20 0x10 0x00| 0x00 0x01 0xFF0x75| 0x20| 0x00 0x81---传输数据:0x36| 0x010x76| 0x01| 0xXX ... 0xXX0x36| 0x050x76| 0x05| 0xXX ... 0xXX---移除出口(停止传输):0x370x77

3.2.5.5.0x38 - RequestFileTransfer

启动客户端与服务端之间的数据传输。
格式:0x38| Transfermode(0x01 - 0x05)| filePathAndNameLength(0x00 0x00)| filePathAndName(0x00 ...)| dataFormatIdentifier(0x00)| fileSizeParameterLength(0x00)| fileSzieUnCompressed(0x00 ...)| fileSizeCompressed(0x00 ...)Transfermode:0x01:AddfilepathAndName0x02:DeletefilepathAndName0x03:Replacefile0x04:Readfile0x05:ReadDir注意:1.当Transfermode为0x02/0x04/0x05时,没有 dataFormatIdentifier(0x00)| fileSizeParameterLength(0x00)| fileSzieUnCompressed(0x00 ...)| fileSizeCompressed(0x00 ...)参数。2.当Transfermode为0x05时,请求中测参数应该使用ASCII格式编码。肯定响应:0x78| 0x01-0x05| 0x00| 0x00 ... 0x00| 0x00| 0x00 0x00| 0x00 ... 0x00| 0x00 ...0x00注意:1.当Trandfermode为0x02,dataFormatIdentifier参数不在响应信息中;当Trandfermode为0x05,dataFormatIdentifier参数为0x00;2.当Transfermode为0x02/0x04/0x05时,没有 fileSizeParameterLength(0x00)| fileSzieUnCompressed(0x00 ...)| fileSizeCompressed(0x00 ...)参数。
否定响应:0x13:信息长度错误;0x22:服务请求未执行成功;0x31:参数无效;0x33:安全校验未通过;0x70:下载因服务端内存故障无法完成;展示案例:0x38| 0x01| 0x00 0x1E| 0x44 ....0x7A| 0x11| 0x02| 0xC3 0x50| 0x75 0x300x78| 0x01| 0x02| 0xC3 0x50| 0x11

4.基于UDS实现ECU刷写

本质:定义了将一个或者多个应用软件以物理方式下载到ROM中。
1.ECU上具有BootLoader程序,以解析向ECU发送的诊断指令;
编程步骤类型分类:
1.标准步骤;
2.可选步骤;
3.正常厂商的具体步骤;
执行过程中每步都需要指定该步骤允许的寻址方法,依据OEM要求选择功能地址或物理地址。基础过程如下:

内存编程过程概述
主执行:协调/同步多个并行运行的编程步骤,控制“预编程步骤”和“后编程步骤”的执行,以及将车辆维持在其已转换到的操作模式中。如将车辆网络转换为允许对单个ECU编程的操作模式或编程节点的结论。
编程执行:各ECU的“编程步骤”可由客户端单独并发执行,直到执行到“编程最后阶段”
1. 下载应用程序软件或应用程序数据
a.传输数据到服务端; b.服务端下载数据; c.编程后车辆网络重新同步;
2. 服务器配置(可选)
a.预编程步骤 - 设置车辆网络以进行服务器配置。 b.编程步骤 - 最终服务器配置。例如用于服务器复位后写入数据。 c.后编程步骤 - 在最终服务器配置后重新同步车辆网络。
预编程:
a.进入extended session; b.使用0x31执行条件检查;c.使用0x85服务关闭DTC存储;d.使用0x28关闭与诊断无关的报文,提高刷写效率;
编程:
a.进入programming session模式;b.使用0x27服务进行安全访问;c.写入指纹信息,标记身份;d.执行0x31,删除存储空间;e.调用数据操作指令进行写数据0x34 0x36 0x37; f.数据校验0x31;g.软件完整性、兼容性等验证;
后编译:
a.将ECU重启0x11或者恢复默认模式0x10;
编程顺序:P431
特殊要求
如果在编程过程中发生以下错误情况,服务器应能够恢复并重新编程。
a.供电电源连接中断;
b.失去地面连接;
c.数据链路通信中断;
d.过压或欠压;

4.1 刷写示例(因为是中文翻译版本,所以表中会有一部分中文):

4.1.1 预编译

4.1.1.1 启动诊断会话

使ECU进入扩展模式。
启动会话
02,0代表单帧,2代表2个长度有效数据,10 03 发起扩展服务请求。
06,0代表单帧,6代表6个长度有效数据,50 03 是对应的指令响应。
疑问:此例子中为什么有两个不同ID内容相同的CAN报文?

4.1.1.2 DTC设置控制(关闭)

设置禁止故障码,关闭DTC功能。
STC设置控制
85 02,85为服务指令,子服务02关闭指令。

4.1.1.3 通信控制

关闭非刷写数据流,关闭普通应用报文。
通信控制
注意事项:当对传输进行传输失能时,使用0x3E服务将服务器状态保持。
28 03 01,28为服务指令,子服务为subfunction 03 disablerxandtx,communicationtype 01 normalcommunicationmessage。

4.1.2 编程阶段

4.1.2.1 编程会话

切换模式,进入编程模式。
编程会话
10 02 指令,10切换模式,自服务02表示编程模式。

4.1.2.2安全校验

a.对ECU进行解锁验证。
请求种子
27 01指令,27安全服务,子服务01为请求seed,得到21 74,进行计算之后,再给出响应。
b.响应种子请求。
在这里插入图片描述
诊断仪给出响应key为47 11,ECU进行校验判断。

4.1.2.3 擦除flash

清除备份内存数据
31 启动擦除, FF 00 协议规定erasememory DID;

4.1.2.4 请求下载

数据下载

数据传输
数据传输

数据传输
数据传输
数据传输结束
结束传输

4.1.2.5 数据验证

验证程序正确和兼容性

4.1.3 后编程

4.1.3.1 写入VIN码

写入VIM码

4.1.3.2 ECU重启

重启

5. 参数定义(P466)

5.1 诊断和通信管理功能单元数据参数定义

5.1.1 通信类型参数定义

5.1.2 EventwindowTime

5.1.3 LinkContrlModeIdentifier

不同设备连接之间的波特率设置。
CAN:125000、250000、500000、1000000;
PC:9600、19200、38400、57600、115200;

5.1.4 NodeIdentificationNumber

5.2 数据传输功能单元数据参数定义

5.2.1 DID

5.2.2 ScalingByte

5.2.3 ScalingByteExtension

5.2.4 TransmissionMode

5.2.5 UDS版本号编码

版本号编码
编码示例:
编码示例

5.3 存储数据传输功能单元数据参数定义

5.3.1 GroupOFDTC

5.3.2 DTCStatusMask/statusOfDTC

5.3.3 DTC严重性和类

5.3.4 DTCFormatIdentifier

5.3.5 FunctionalGroupIdentifier

5.3.6 DTCFaultDetectionCounter

5.3.7 DTCAgingCounter(距故障最新失败以来的驱动周期数)

5.4 输入输出控制功能单元数据参数定义

5.4.1 InputOutputControlParameter

5.4.2 RoutineIdentifier

5.5 上传下载功能单元数据参数

5.5.1 NodeofOperation

5.6 安全访问状态图

更多详细信息请查看协议标准

6.诊断帧结构类型

单帧:当报文长度小于7,数据域高4位为0000,表示为单帧;
首帧:前2字节作为PCI信息,高4位为0001,低4位及第2字节描述数据总长;
连续帧:第1个字节作为PCI,高4位为0010,低4位为连续序列号;
流控帧:数据发送控制,高4位为0011,低4位为FlowStatus,0-ContinueToSend,1-Wait,2-overflow。第2字节为BlockSize,指示一次可以发送多少个连续帧。 第3字节为Seperatetime;
示例:
单帧:
request 02 10 03 55 55 55 55 55
response 06 50 03 00 32 01 FA AA

多帧传输:
03 19 02 08 55 55 55 55 (诊断仪发送的SingleFrame的request)
10 33 59 02 19 01 00 07 (ECU以FirstFrame开始传输的response)
30 00 00 55 55 55 55 55 (诊断仪发送的FlowControl)
21 09 03 05 02 09 05 04 (ECU发送的ConsecutiveFrame)
22 07 09 05 06 06 09 05 (ECU发送的ConsecutiveFrame)
23 08 03 08 07 01 05 08 (ECU发送的ConsecutiveFrame)
24 07 01 06 08 07 01 0C (ECU发送的ConsecutiveFrame)
25 08 07 01 0D 08 07 03 (ECU发送的ConsecutiveFrame)
26 07 09 08 01 01 09 09 (ECU发送的ConsecutiveFrame)
27 01 07 09 AA AA AA AA (ECU发送的ConsecutiveFrame,此时传输结束)

数据示例来源于此文

7.参考文章

控制器网络诊断专栏
UDS入门
UDS-ECU刷写
UDS网络层/tp层
UDS详解
汽车控制器网络技术交流
汽车电子ECU BootLoader开发要点详解


http://chatgpt.dhexx.cn/article/CxI8DgEB.shtml

相关文章

UDS诊断入门

UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是ISO 15765 和ISO 14229 定义的一种汽车通用诊断协议,位于OSI模型中的应用层,它可在不同的汽车总线(例如CAN, LIN, Flexray, Internet 和K-line&…

软件工程 第4版张海藩 pdf_2019年第4期软件工程造价师培训课程圆满结束

2019年2月20至22日,由北京软件造价评估技术创新联盟举办的2019年第4期(总第208期)软件工程造价师培训课程在北京圆满结束。 来自系统工程所、江苏国创新云、东软望海科技等公司的近20名学员参加培训。培训课上,培训老师系统讲解了国家标准和行业标准中规…

软件设计师考试-软件工程

1. 软件开发模型 瀑布模型 瀑布模型把软件开发分为三大阶段:定义阶段、开发阶段、维护阶段。 瀑布模型的最大缺点在于不能灵活应对变化的需求,瀑布模型适用于需求明确的情况。 软件测试完成后的工作产品,例如系统测试数据、系统测试结果、…

软考之软件工程

软件过程 软件成熟度模型(CMM) 软件过程改进的框架:过程改进基础设施、过程改进线路图、软件过程评估方法、软件过程改进计划。 每一次软件改进要精力4个步骤:评估、计划、改进和监控。 能力成熟度模型集成(CMMI&a…

广东二级造价工程师《造价管理》真题解析

2022年广东二级造价工程师考试结束之后,有些网友吐槽:说今年的二造考试出题有点偏,有点难。不过也有网友表示so easy~ 由于二造是机考,当场出分。现在只能期待今年及格线和以往一样。成绩不太理想的考生也不要紧,抓紧看…

软件 工程

目录 第十章、软件工程1、瀑布模型(SDLC)2、快速原型模型3、增量模型4、螺旋模型5、Ⅴ模型6、喷泉模型7、构建组装模型(CBSD)8、统一过程(RUP)9、敏捷开发方法10、信息系统开发方法11、需求开发12、结构化设…

造价师工程师零基础自学

二级造价工程师零基础自学可以考过,但是前提是自己要有很强的学习能力和自律性。帮过网表示,二级造价工程师考试难度不小,想要考过还是要付出很多的努力的。 1、零基础怎么备考二级造价师 一:理解基础知识——看教材。 作为小白…

2、软件造价总结(主要基准数据)

1、软件开发生产率 2、人月费率 3、功能点单价 功能点单价基准为 1245.19 元/功能点(以北京地区 功能点(以北京地区 统计数据 中位数 为基准, 费用包含 软件 开发 的直接 人力成本、间直接 人力成本、间人力 成本 、间接非人力成本 、间接非…

软考软件设计师----软件工程(自用)

本篇博文目录: 1.CMM与CMMI(1) CMM(2) CMMI 2.软件开发模型(1) 瀑布模型(2) V模型(3) 增量模型(4) 演化模型(5) 喷泉模型(6) 统一过程模型 3.敏捷方法(1) 软件需求(2) 系统设计(3) 系统测试 4.测试(1)单元测试(2)集成测试(3) 测试方法 5.运行和维护知识(1) 系统可维护的评价指标…

软件工程(Software Engineering)

软件工程(Software Engineering) GTI-分布式版本控制系统查看已有的git配置信息DVOS运维一体化单分支模型exitgit --versiongit clone urlnotepadgit config --listgit initgit remote add originjava JDK版本Builder Design Mode质量属性 FURPS功能性&a…

软考-软件工程

目录 🍓软件工程概述 🧀1.软件生存周期 🧅2.软件生存周期模型 🍚瀑布模型 🍈快速原型 🍘增量模型 🍯螺旋模型 🧀喷泉模型 🍪敏捷过程 🍣3.软件开发…

Springboot+建筑造价师资格考试应试网站设计与实现 毕业设计-附源码260839

Springboot建筑造价师资格考试应试网站 摘 要 如何合理确定和有效控制工程投资,是工程项目建设的一大难题,如何使建筑工程造价管理与社会生产水平相适应,是建筑工程造价管理中需要解决的问题,只有加强建筑工程造价管理工作力度&a…

linux强行退出线程,Linux 多线程编程--线程退出

今天分析项目中进程中虚存一直增长问题,运行10个小时虚存涨到121G ,RSS占用为16G 非常恐怖。 顺便查了下Linux单进程能创建线程的上限,以及相关内容。内存32G 64bit系统信息如下: Linux线程使用方式是主进程依据请求的多少动态创建…

Linux线程优先级设置

Linux内核的三种调度策略: 1.SCHED_OTHER 分时调度策略 2.SCHED_FIFO 实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR实 时调度策略,时间片轮转。当进程的时间片用完&#xff0…

linux多线程编程 实验,linux操作系统-实验五-linux 多线程编程.docx

linux操作系统-实验五-linux 多线程编程.docx 操作系统 实验报告 实验序号 5 实验项目名称 Linux 多线程编程 学 号 姓 名 专业、班 实验地点 指导教师 实验时间 2015.10.13 一、实验目的及要求 通过本实验的学习,使学生掌握 Linux 多线程编程的基本方法。 以学生自…

Linux下多线程的操作

线程定义 **定义:**线程是轻量级的进程(LWP:light weight pocess),在Linux环境下线程的本质仍然是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位…

Linux多线程——概念

目录 前言 一.线程的概念 1.1 什么是线程 1.2 线程的优点 1.3 线程缺点 1.4 线程异常 1.5 线程用途 1.6 Linux进程和线程对比 1.7 关于进程和线程的问题 1.7.1 POSIX线程库 1.7.2 进程ID和线程ID 1.7.3 线程ID和进程地址空间 1.7.4 线程库与内核线程的关系 二.线程管理 …

Linux多线程 | 线程同步

文章目录 前言主要介绍四种常用的线程同步方式以及相关的函数接口。 一、线程同步二、同步方法1.互斥锁2.信号量3.条件变量4.读写锁 总结 前言 主要介绍四种常用的线程同步方式以及相关的函数接口。 提示:以下是本篇文章正文内容,下面案例可供参考 一…

linux多线程实验实验报告,Linux多线程实验.ppt

Linux多线程实验.ppt (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 Linux多线程实验实验目的掌握Linux多线程程序编写。 Date1实验设备硬件PC机(带网卡) 1台MagicARM270教学实验开…

linux线程全解

目录 一、再论进程1、进程的挂起、阻塞和睡眠的区别:2、多进程实现同时读取键盘和鼠标 二、线程的引入1、线程进程的区别体现在几个方面2、进程与线程的选择取决以下几点3、使用线程技术同时读取键盘和鼠标 三、线程常见函数1、线程创建与回收2、线程取消3、线程函数…