Skip to content

Latest commit

 

History

History
1309 lines (1113 loc) · 47 KB

uds.md

File metadata and controls

1309 lines (1113 loc) · 47 KB

介绍

UDS协议介绍

国际标准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诊断模型

uds1

常见名词解释

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

诊断数据类型

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

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

诊断请求报文

uds2

srp=1,ECU不给出正响应srp=0,ECU给出正响应;目的:告诉ECU是否需要发送响应数据;

正响应报文

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

负响应报文

  • byte1:response service id = 0x7F
  • byte2:spr + sub-function = service id
  • byte3:NRC,诊断指令执行失败错误码

例如: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:暂保留;

诊断服务类型简述

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

诊断与通信管理

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

解释:请求控制与ECU的诊断会话。
格式:
	0x10|SessionType

SessionType-请求消息子功能定义:
	0x00 ISOSAEReserved(保留)
	0x01 defaultSession(ECU上电后的默认状态)
	0x02 ProgrammingSession(进行软件刷写相关的服务)
		用于解锁BootLoader相关的诊断服务,即程序烧写;
	0x03 extendedDiagnosticSession(诊断启动后接收到10 03转为该状态)
		用于解锁高权限诊断服务,如写入数据、参数、读写诊断码;
	0x04 safetySystemDiagnosticSession
	0x05 – 0x3F ISOSAEReserved(保留)
	0x40 – 0x5F vehicleManufacturerSpecific(由整车厂自定义使用)
	0x60 – 0x7E systemSupplierSpecific(由ECU供应商自定义使用)
	0x7F -  ISOSAEReserved(保留)

肯定响应:
	0x50|SessionType|SessionParameterRecord.......
否定响应:
	0x12:不支持子功能参数;
	0x13:消息长度错误;
	0x22:不满足请求标准/条件;

0x11 - ECUReset

强制对ECU进行重置。
格式:
	0x11|resetType
	
resetType - 请求消息子功能定义
	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未被解锁,请求重置受到了保护;

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 = 0x02
			requestseed = 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|0x01
	service seed : 0x67|0x01|0x36 0x57
	(2)发送秘钥
	sendkey : 0x27|0x02|0xC9 0xA9
	response  : 0x67|0x02 
2.服务端处于“解锁”状态
	(1)请求种子
		requestseed:0x27|0x01
		service seed:0x67|0x01|0x00 0x00

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| 0x01
	2.将远程网络地址为0x000A节点连接到仅诊断调度模式
		0x28| 0x04| 0x01| 0x00 0x0A
		0x68| 0x04
	3.切换到具有增强地址信息的应用程序调度模式,连接到子网络节点0x000A
		0x28| 0x05| 0x01 0x00 0x0A
		0x68| 0x05

0x3E - TesterPresent

使ECU保持连接状态,并将已机会的诊断服务或者通信保持现有状态。可防止服务端恢复为默认状态。
格式:
	0x3E| subFunction(0x00-0x80)
subFunction:
	0x00:不支持suppressPosRspMsgIndicationBit子函数值;	
	0x01 - 0x7F:值保留;

肯定响应:
	0X7E| 0X00
否定响应:
	0x12:不支持子功能参数;
	0x13:消息长度错误;

展示案例:
	1.请求消息流程案例
		0x3E| 0x00
		0x7E| 0x00
	2.可定响应消息流程
		0x3E| 0x80
		无响应由服务器发送

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

0x84 - SecuredDataTransmission

执行扩展数据链接安全性数据传输;
常见诊断服务数据传输方法:
	1.不安全的数据传输模式
	2.安全的数据传输模式
	注:如下服务不可在安全模式下执行:a.0x86/0x2A/0x3E
格式:
	0x84| Data.....

肯定响应:
	0xC4| Data.....
否定响应:
	0x13:数据长度错误;
	0x38 - 0x4F:保留;

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.0
	0x85| 0x02
	0xC5| 0X02
2.请求消息流程2.0
	0x85| 0x01
	0xC5| 0x01

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):
		0x00
		0x01
子功能参数:
	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.0
		0x86| 0x01| 0x08| 0x01| 0x19 0x01 0x01
		0xC6| 0x01| 0x00| 0x08| 0x01(testFailed)| 0x19 0x01 0x01
	2.请求消息流程示例2.0
		0x86| 0x05| 0x08
		0xC6| 0x01| 0x00| 0x08
	3.请求消息流程示例3.0
		0x86| 0x05| 0x08
		0xC6| 0x01| 0x00| 0x08
		readDTCInformation:
	更多查看P128

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 - 0x7F
	f否定响应:
		0x12:不支持子功能参数;
		0x13:消息长度或格式错误;
		0x22:条件不满足;
		0x24:
		0x31:参数错误;
		
展示案例:
	1.请求格式:0x87| 0x02| Data....
	2.请求格式:0x87| 0x03
	3.设置波特率
		0x87| 0x01| 0x05(115200kBit/s)
		0xC7| 0x01
		转换波特率
		0x87| 0x83
		无响应应答
	4.转换波特率为特定值
		0x87| 0x02| 0x02 0x49 0xF0 (249F0 - 150000)
		0xC7| 0x02	
		转换波特率
		0x87| 0x83
		无响应应答
	5.验证是否满足转换条件
		0x87| 0x01| 0x20
		0xC7| 0x01
		转换到编程调度器
		0x87| 0x83		

数据传输单元

0x22 - ReadDataByIdentifier

客户端请求包含一个或者多个字节的诊断数据,用于表示服务器维护记录。数据的格式由整车制造商或系统供应商定义。
格式:
	0x22| dataIdentifier(0x00-0xFF...) |......
	
肯定响应:
	0x62| dataIdentifier(0x00-0xFF...)|.......
否定响应:
	0x13:消息长度或格式错误;
	0x14:
	0x22:条件不满足;
	0x31:参数错误;
	0x33:安全校验未通过;

展示案例:
	1.读取VIN码数据
		0x22| 0xF1 0x90
		0x62| 0xF1 0x90| 0x57 0x30 0x4C 0x30 0x30 0x30 0x30 0x34 0x33 0x4D 0x42 0x35 0x34 0x31 0x33 0x32 0x36
	2.读取多个数据(0x010A和0x0110)
		0x22| 0x01 0x0A| 0x01 0x10 
		0x62| 0x01 0x0A| 0xA6 	* * * * * *  * * * | 0X01(MSB) 0X10(LSB)| 0x8C

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 0x03
		0x63| 0x00 ..... 0x8C(260个字节长度)
	2.2字节寻址(从0x4813地址开始读取2字节)
		0x23| 0x12| 0x48 0x13 0x05
		0x63| 0x43 0x2A 0x07 0x2A 0x55
	3.3字节寻址
		0x23| 0x23| 0x20 0x48 0x13| 0x00 0x03
		0x63| 0x00 0x01 0x8C

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 0x90
		0x64| 0xF1 0x90 | 0x6F | 0X62
	2.请求车速(0x0105)
		0x24|  0x01 0x05
		0x64| 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/h
	3.请求数据(0x0967)示例数据定义见表171
		0x24| 0x09 0x67
		0x64| 0x09 0x67| 0x22(2个数据字节)| 0x03 0x43					

uds3

0x2A - ReadDataByPeriodicIdentifier

请求服务端周期性传输数据。
格式:
	0x2A| TransmissionMode(0x0000xFF)| Data .....
肯定响应:
	0x6A
	定期数据响应:periodicDataIdentifier (0x00-0xFF)| Data.....
否定响应:
	0x13:参数长度错误;
	0x22:条件不满足;
	0x31:请求不支持;
	0x33:安全检查未通过;

展示案例:
	1.读取0xE3 0x24数据
		E3包含冷却液温度、节气门温度、发动机转速、车速传感器;0x24包含电池正极电压、气管绝对值眼里、质量控制流量、车辆气压、负载值;
		发出数据传输请求:
		0x2A| 0x02| 0xE3| 0x24
		0x6A
		0xE3| 0xA6 0x66 0x07 0x50 0x00
		0x24| 0x8C 0x20 0x1A 0x63 0x4A
		发出数据停止传输请求:
		0x2A| 0x04| 0xE3
		0x6A		

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翻译文档P213
	1.生成单个数据信息(2字节标识符)
		0x22| 0xF3 0x01
		0x6C| 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(爆震传感器)| 0x01
		0x6C| 0x01| 0xF3 0X02
		-----请求消息
		0x22| 0xF3 0x02
		0X6C| 0xF3 0x02| 0xA6 0x07 0x50 0x82 0x91
	3.发送依据内存地址构建的数据标识符的数据请求(动态数据请求)
		0x2C| 0x02 0xF3 0x02| 0x14| 0x21 0x09(发动机温度)| 0x19 0x69| 0x01| 0x21 0x09 0x19 0x6B(发动机转速)| 0x02| 0x013 0x10 0x19 0x95(爆震传感器)| 0x01
		0x6C| 0x02| 0xF3 0x02
		------请求消息
		0x22| 0xF3 0x02
		0X6C| 0xF3 0x02| 0xA6 0x07 0x50 0x91
	4.动态构建数据标识符,并依据标识符请求服务端定期发送数据
		生成包含发动机冷却液0x010A、发动机转速0x010A、保准传感器0x050B的动态数据标识符0xF2E7。
		0x2C| 0x01| 0xF2 0xE7| 0x01 0x0A| 0x02(发动机冷却温度)| 0x01 0x0A| 0x04(发动机转速)| 0x02| 0x05 0x0B| 0x02(震爆传感器)| 0x01
		0x6C| 0x01| 0xF2 0xE7
		------请求消息
		0x2A| 0x04| 0xE7
		0x6A| 0xE7| 0xA6 0x07 0x50 0x91 
		0xE7| 0xA6 0x07 0x55 0x98(周期性发送数据)
	5.删除动态定义的数据标识符
		请求清除0xF303消息
		0x2C| 0x03| 0xF3 0x03
		0x6C| 0x03| 0xF3 0x03
	6.使用两种定义类型建立一个动态数据标识符
		a.发动机油温和环境空气温度2字节DID引用;
		b.内存地址引用的发动机冷却液温度和发动机转速;
		c.发动机油位由2字节DID引用;
		0x2c| 0x01| 0xF3 0x01| 0x12 0x34(发动机油温)| 0x01 0x02| 0x56 0x78(环境空气温度)| 0x01| 0x01
		0x6C| 0x01| 0xF3 0x01
		-----
		0x2C| 0x02| 0xF3 0x01| 0x14| 0x21 0x09 0x19 0x69| 0x01(发动机冷却液温度)| 0x21 0x09 0x19 0x6B(发动机转速)| 0x02
		0x6C| 0x02| 0xF3 0x01
		------
		0x2C| 0x01| 0xF3 0x01| 0x9A 0xBC(发动机油位)| 0x01| 0x04
		0x6C| 0x01| 0xF3 0x01
		-------
		0x22| 0xF3 0x01
		0x62| 0xF3 0x01| 0x4C 0x36 0x4D 0xA6 0x07 0x50 0x49 0x21 0x00 0x17
		------
		0x2C| 0x03| 0xF3 0x01
		0x6C| 0x03| 0xF3 0x01

0x2E - WriteDataByIdentifier

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

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 0x8C
		0x7D| 0x12| 0x20 0x48| 0x02
	2.将数据字节写入服务内存(3字节寻址)
		0x3D| 0X13| 0x20 0x48 0x13| 0x03| 0x00 0x01 0x8C
		0x7D| 0x13| 0x20 0x48 0x13| 0x03
	3.’将数据字节写入服务内存(4字节寻址)
		0x3D| 0x14| 0x20 0x48 0x13 0x13 0x09| 0x05| 0x00 0x01 0x8C 0x09 0xAF
		0x7D| 0x14| 0x20 0x48 0x13 0x09| 0x05

存储数据传输单元

0x14 - ClearDiagnoticInformation

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

展示案例:
	1.请求排放系统信息
		0x14| 0xFF 0xFF 0x33
		0x54		

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.DTCFormatIdentifier
		0x00 - 标识参考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| 0x08
		0x59| 0x01| 0x2F| 0x01| 0x00 0x01
	5.请求与状态掩码匹配的信息
		0x19| 0x02| 0x84
		0x59| 0x02| 0x7F| 0x0A 0x9B 0x17 0x24| 0x08 0x05 0x11 0x2F
		---
		0x19| 0x02| 0x01
		0x59| 0x02| 0x7F
		---
	6.返回三个快照数据
		0x19| 0x03
		0x59| 0x03| 0x12 0x34 0x56 0x01| 0x12 0x34 0x56 0x02| 0x7 0x9A 0xBC 0x01
		发动机冷却液温度:0xA6 0x66 0x07 0x50 0x20
	7.返回一个快照数据			
		0x19| 0x04 | 0x12 0x34 0x56| 0x02
		0x59| 0x04| 0x12 0x34 0x56 0x24| 0x02| 0x01| 0x47 0x11| 0xA6 0x66 0x07 0x50 0x20			
	8.返回DTC存储数据
		0x19| 0x05| 0x02
		0x59| 0x05| 0x02| 0x12 0x34 0x56 0x24 0x01| 0x47 0x11| 0xA6 0x66 0x07 0x50 0x20
	9.返回DTC扩展数据编号
		预热循环计数器-0x05->0x17
		DTC故障检测计数器-0x10->0x79
		0x19| 0x06|0x12 0x34 0x56| 0xFF
		0x59| 0x06| 0x12 0x34 0x56 0x24| 0x05| 0x17| 0x10| 0x79
	10.报告所有的DTC扩展记录
		0x19| 0x06| 0x12 0x34 0x56| 0xFF
		0x59| 0x06| 0x12 0x34 0x56 0x24| 0x05| 0x17| 0x10| 0x79
	11.P314(其他案例此处暂时省略)

输入输出控制单元

0x2F - InputOutputControlByIdentifier

用于简单的输入替换输出控制。
格式:
	0x2F| 0x00 0x00| 0x00 0x00 ...| 0x00 0x00 ...
肯定响应:
	0x6F| 0x00 0x00| 0x00 0x00 ...
否定响应:
	0x13:长度错误;
	0x22:条件不满足;
	0x31:参数无效;
	0x33:安全检查未通过;

注意:
	InputOutputControlParameter
		0x00:结束控制
		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 0x00
		0x62| 0x9B 0x00| 0x3C(60->60%,说明当前位置已到了60%)
		---
		查询数据:
		0x2F| 0x9B 0x00| 0x00
		0X6F| 0x9B 0x00| 0x00| 0x3A(接收请求,58->58%,说明当前位置已到了58%)
		---
		0x2F| 0x9B 0x00| 0x02
		0X6F| 0x9B 0x00| 0x02 0x32(50%)
	2.仅控制IAC Pintle位置
		0x2F| 0x01 0x55| 0x03 0x07 0x0XX 0xXX 0xYZ 0xXX| 0x80
		0x6F| 0x01 0x55| 0x03 0x07 0x02 0xEE 0x12 0x59	
		---
		仅控制RPM
		0x2F| 0x01 0x55| 0x03 0xXX 0x03 0xE8 0xYZ 0xXX| 0x40
		0x6F| 0x01 0x55| 0x03 0x09 0x03 0xB6 0x12 0x59
		---
		控制踏板位置A和EGR占空比
		0x2F| 0x01 0x55| 0x03 0xXX 0xXX 0xXX 0x3Z 0x72| 0x28
		0x6F| 0x01 0x55| 0x03 0x07 0x03 0x52 0x32 0x69
		---
		将所有参数的控制返回给ECU
		0x2F| 0x01 0x55| 0x00| 0xFF
		0x6F| 0x01 0x55| 0x00 0x09 0x03 0x52 0x12 0x59

常规功能单元

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 - RID
	0x0000-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 0x01
		0x71| 0x01| 0x02 0x01 0x32
	2.基于测试条件:已点火、未打开发动机、速度为0进行测试,进行停止测试。
		0x31| 0x02| 0x02 0x01
		0x71| 0x02| 0x02 0x01 0x30
	3.检测结果值
		0x31| 0x03| 0x02 0x01
		0x71| 0x03| 0x02 0x01 0x30 0x33 ... 0x8F
	4.在规定条件下,启动例程
		0x31| 0x01| 0x02 0x02| 0x06 0x01
		0x71| 0x01|0x02 0x02| 0x32 0x33 ....0x8F

下载上传功能单元

0x34 - RequestDownload

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

0x35 - RequestUpload

从服务端到客户端进行数据传输。
格式:
	0x35| dataFormIdentifier(0x00)| addressAndLengthFormatIdentifier(0x00)| 0x00 ... 0x00| 0x00 ... 0x00

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

0x36 - TransferData

用于服务端与客户端之间的数据传输。
格式:
	0x36| blockSequenceCounter(0x00)| 0x00 ... 0x00

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

0x37 - RequestTransferExit

终止客户端与服务端之间的数据传输。
格式:
	0x37|transferRequestParameterRecord(0x00 .. 0x00)

肯定响应:
	0x77| transferResponsetParameterRecord(0x00 .. 0x00)
否定响应:
	0x13:消息长度错误;
	0x24:收到请求时编程过程未完成;传输服务已停止;
	0x31:无效数据;
	0x72:服务端下载数据时数据被擦除;

展示案例:
	1.客户端从服务端下载数据。
		memoryaddress 0x602000
		dataFormatIdentifier:0x11
		memorySize:0x00FFFF
		transferResponseParameter:0x0081
		---
		请求下载:
		0x34| 0x11| 0x33| 0x60 0x20 0x00| 0x00 0xFF 0xFF
		0x74| 0x20| 0x00 0x81
		---
		传输数据:
		0x36| 0x01| 0x00 ...0x00
		0x76| 0x01
		0x36| 0x05| 0xXX  ...0xXX
		0x76 0x05		
		---
		移除出口(停止传输):
		0x37
		0x77
	1.客户端向服务端上传数据。
		memoryaddress 0x201000
		dataFormatIdentifier:0x11
		memorySize:0x0001FF
		transferResponseParameter:0x0081
		---
		请求上传:
		0x35| 0x11| 0x33| 0x20 0x10 0x00| 0x00 0x01 0xFF
		0x75| 0x20| 0x00 0x81
		---
		传输数据:
		0x36| 0x01
		0x76| 0x01| 0xXX ... 0xXX
		0x36| 0x05
		0x76| 0x05| 0xXX ... 0xXX
		---
		移除出口(停止传输):
		0x37
		0x77

0x38 - RequestFileTransfer

启动客户端与服务端之间的数据传输。
格式:
	0x38| Transfermode(0x01 - 0x05)| filePathAndNameLength(0x00 0x00)| filePathAndName(0x00 ...)| dataFormatIdentifier(0x00)| fileSizeParameterLength(0x00)| fileSzieUnCompressed(0x00 ...)| fileSizeCompressed(0x00 ...)
	Transfermode:
		0x01:AddfilepathAndName
		0x02:DeletefilepathAndName
		0x03:Replacefile
		0x04:Readfile
		0x05: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 0x30
	0x78| 0x01| 0x02| 0xC3 0x50| 0x11

基于UDS实现ECU刷写

本质:定义了将一个或者多个应用软件以物理方式下载到ROM中。

ECU上具有BootLoader程序,以解析向ECU发送的诊断指令;编程步骤类型分类:

  1. 标准步骤;
  2. 可选步骤;
  3. 正常厂商的具体步骤;

执行过程中每步都需要指定该步骤允许的寻址方法,依据OEM要求选择功能地址或物理地址。基础过程如下:

uds4

主执行:协调/同步多个并行运行的编程步骤,控制“预编程步骤”和“后编程步骤”的执行,以及将车辆维持在其已转换到的操作模式中。如将车辆网络转换为允许对单个ECU编程的操作模式或编程节点的结论。

编程执行:各ECU的“编程步骤”可由客户端单独并发执行,直到执行到“编程最后阶段”

下载应用程序软件或应用程序数据

  1. 传输数据到服务端;
  2. 服务端下载数据;
  3. 编程后车辆网络重新同步;

服务器配置(可选)

  1. 预编程步骤 - 设置车辆网络以进行服务器配置。
  2. 编程步骤 - 最终服务器配置。例如用于服务器复位后写入数据。
  3. 后编程步骤 - 在最终服务器配置后重新同步车辆网络。

预编程

  1. 进入extended session;
  2. 使用0x31执行条件检查;
  3. 使用0x85服务关闭DTC存储;
  4. 使用0x28关闭与诊断无关的报文,提高刷写效率;

编程

  1. 进入programming session模式;
  2. 使用0x27服务进行安全访问;
  3. 写入指纹信息,标记身份;
  4. 执行0x31,删除存储空间;
  5. 调用数据操作指令进行写数据0x34 0x36 0x37;
  6. 数据校验0x31;
  7. 软件完整性、兼容性等验证;

后编译:

  1. 将ECU重启0x11或者恢复默认模式0x10; 编程顺序:P431

特殊要求: 如果在编程过程中发生以下错误情况,服务器应能够恢复并重新编程。

  • 供电电源连接中断;
  • 失去地面连接;
  • 数据链路通信中断;
  • 过压或欠压;

刷写示例

预编译

启动诊断会话

使ECU进入扩展模式。

uds5

02,0代表单帧,2代表2个长度有效数据,10 03 发起扩展服务请求。 06,0代表单帧,6代表6个长度有效数据,50 03 是对应的指令响应。

DTC设置控制(关闭)

设置禁止故障码,关闭DTC功能。

uds6

85 02,85为服务指令,子服务02关闭指令。

通信控制

关闭非刷写数据流,关闭普通应用报文。

uds7

注意事项:当对传输进行传输失能时,使用0x3E服务将服务器状态保持。

28 03 01,28为服务指令,子服务为subfunction 03 disablerxandtx,communicationtype 01 normalcommunicationmessage。

编程阶段

编程会话

切换模式,进入编程模式。

uds8

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

安全校验

a.对ECU进行解锁验证

uds9

27 01指令,27安全服务,子服务01为请求seed,得到21 74,进行计算之后,再给出响应。

b.响应种子请求

uds10

诊断仪给出响应key为47 11,ECU进行校验判断。

擦除flash

uds11

31 启动擦除, FF 00 协议规定erase memory DID;

请求下载

uds12

a.数据传输

uds13

uds14

uds15

b.数据传输结束

uds16

数据验证

uds17

后编程

写入VIN码

uds18

ECU重启

uds19