Upload Download functional unit
从成本等角度考虑,汽车ECU中用于缓存诊断服务数据的buffer大小有限,所以当我们需要读取或写入超过buffer大小的数据时,就无法简单地使用2E和22服务了,UDS据此定义了几个将大块数据写入或读出的服务,即数据下载和上传。
UDS的第六类诊断服务:存储数据传输。该类型服务包含SID如下:
RequestDownload (0x34):请求下载数据,诊断仪向ECU请求下载数据
RequestUpload (0x35):请求上传数据,诊断仪向ECU请求上传数据
TransferData (0x36):数据传输,诊断仪向ECU传数据(下载),或者ECU向诊断仪传数据(上传)
RequestTransferExit (0x37):数据传输完成,请求退出
RequestFileTransfer (0x38):请求文件传输,可以用于替代上传下载的服务
1. RequestDownload (0x34) service
该服务用于启动下载传输,作用是告知ECU准备接受数据,ECU则通过0x74 response告诉诊断仪自己是否允许传输,以及自己的接受能力是多大。
1.1 请求格式
由上图可知,请求格式分为5部分
第一部分:请求SID(1byte):0x34
第二部分:dataFormatIdentifier(1byte):这里面标识了数据格式相关的信息,比如数据是否有压缩,是否有加密,用的什么算法加密等,由主机厂与供应商约定好,用哪个bit来表示压缩、加密等信息。
第三部分:addressAndLengthFormatIdentifier(1byte):该参数是代表后续的两个部分memoryAddress和memorySize所占的字节长度。addressAndLengthFormatIdentifier的低4bit表示memoryAddress,高4bit表示memorySize。如:memoryAddress参数占用0xm个字节,memorySize参数占用0xn个字节,则addressAndLengthFormatIdentifier值为0xnm
第四部分:memoryAddress(m个byte):诊断仪向ECU请求下载写入数据的逻辑地址值。如:诊断仪请求ECU写入数据的内存逻辑地址为0x12345678(memoryAddress占4个字节),则memoryAddress值为0x12345678,对应addressAndLengthFormatIdentifier低4bit值为0x04.
第五部分:memorySize(n个字节):诊断仪向ECU请求下载写入数据的字节数。如:诊断仪写入ECU数据的字节数为0x01234567(memorySize占4字节),则memorySize值为0x01234567,对应的addressAndLengthFormatIdentifier高4bit值为0x4。
1.2 响应格式
由上图可知响应格式分为三个部分
第一部分:response SID (1byte): 0x74
第二部分:lengthFormatIdentifier(1byte):高4bit为maxNumberOfBlockLength有效字节长度,低4bit保留为0.
第三分部:maxNumberOfBlockLength:字节长度不定,表示0x36服务一次传输一个block的最大的字节数。如:maxNumberOfBlockLength=0x202,则应用层36服务一次最多发送字节数为0x202(字节数:0x202 >= 36 (1byte)+ parameter(x个byte))。后续36服务会细讲。
1.3 举例
诊断仪向ECU请求下载数据,dataFormatIdentifier值为0x00,该值有厂家或供应商协商制定,此处暂定为0x00。memoryAddress值为0x0x12345678(占4个字节),memorySize值为0x01234567(占4字节),则addressAndLengthFormatIdentifier值为0x44(该值计算方式上述请求格式中以说明)。
上图中不同颜色代表不同的参数
橙色:addressAndLengthFormatIdentifier(0x44)
紫色:memoryAddress(0x12345678)
绿色:memorySize(0x01234567)
青色:maxNumberOfBlockLength(0x0202)
2. TransferData (0x36) service
如果34服务得到了正确响应,诊断仪就要启动数据传输过程了,使用的就是36服务。
2.1 请求格式
上图可知请求格式分为三个部分
第一部分:请求SID :0x36(1个byte)
第二部分:blockSequenceCounter(1个byte),34服务后,发送的第一个36服务时clockSequenceCounter=0x01,每次36服务请求便自增1,当增加到0xFF,此时下次请求36服务发送数据时blockSequenceCounter=0x00。
第三部分:transferRequestParameterRecord:字节长短和参数格式不定,由厂家制定。发送请求的数据。
2.2 响应格式
由上图可知响应格式分为三个部分
第一部分:response SID:0x76
第二部分:blockSequenceCounter:对请求的blockSequenceCounter的echo
第三部分:transferResponseParameterRecord,当36服务用于上传数据时,该参数必须的。36服务用于下载数据时,该参数非必须,此处不解析。
2.3 举例
假设诊断仪34服务请求下载30字节,ECU反馈每次最大下载maxNumberOfBlockLength为0x0A,则诊断仪使用36服务下载数据如下图所示:
3. RequestTransferExit (0x37) service
37服务用于退出上传下载,即诊断仪通过该诊断服务停止与ECU之间的数据传输。如果之前的34和36服务都顺利执行完成,那么37服务就可以得到ECU的positive response。否则ECU会负响应NRC 0x7F 37 24,表示诊断序列执行有错误。
3.1 请求格式
由上图可知请求格式分为两个部分
第一部分:请求SID:0x37
第二部分:transferRequestParameterRecord,字节长度和参数格式,厂家自定义,没有定义则默认字节数据为0。
3.2 响应格式
由上图可知响应格式分为两个部分
第一部分:response SID:0x77
第二部分:transferResponseParameterRecord,字节长度和参数格式,厂家自定义,没有定义则默认字节数据为0。
3.3 举例
UDS协议栈系列文章: