《UDS协议从入门到精通》系列——图解0x38:请求上传
- 一、简介
- 二、数据包格式
- 2.1 服务请求格式
- 2.2 服务响应格式
- 2.2.1 肯定响应
- 2.2.2 否定响应
- 三、通信示例
Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快速了解他们。(各服务介绍持续更新中…)
学习UDS基础知识以及其他相关内容?>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<
一、简介
UDS协议中的0x38服务,即RequestFileTransfer服务,是一种用于文件数据传输的服务。这个服务允许Tester发起从Tester到目标ECU或从目标ECU到Tester的文件数据传输,即上传或下载文件。此外,这个服务还能够获取关于服务器文件系统的信息。
这个服务的目的是作为一个替代方案,用于那些支持数据上传和下载功能,并且实现了文件系统进行数据存储的目标ECU。如果目标ECU具备文件系统,那么在进行文件的下载或上传时,应该使用RequestFileTransfer服务来替代传统的RequestDownload或RequestUpload服务。
在实际的文件传输过程中,数据传输和数据传输的终止是通过使用TransferData和RequestTransferExit服务来实现的,这与使用RequestDownload或RequestUpload服务时的操作相同。此外,这个服务还支持在目标ECU的文件系统中删除文件或目录的功能,但在这种情况下,TransferData和RequestTransferExit服务是不适用的。
当目标ECU接收到RequestFileTransfer请求消息后,它将采取所有必要的行动来准备接收或发送数据,然后才会发送一个正响应消息。这意味着目标ECU在开始实际的数据传输之前,会先准备好相应的文件系统操作,确保数据传输可以顺利进行。
Tip📌:总之,0x38服务是一个多功能的文件传输服务,它不仅支持文件的上传和下载,还能获取文件系统信息,并且在必要时可以删除目标ECU上的文件或目录。该服务特别适用于那些具备文件系统的目标ECU,为它们提供了一个更加灵活和强大的文件管理解决方案。
二、数据包格式
2.1 服务请求格式
该服务不支持sub-function。部分参数的含义如下所示:
modeOfOperation:指的是对文件或目录执行的操作类型。操作类型包括添加、删除、替换或读取文件,以及读取目录等。具体如下表所示。
取值 | 描述 |
---|---|
0x00 | ISO/SAE保留 |
0x01 | 添加文件 用于添加(下载)filePathAndName参数中定义的文件。 |
0x02 | 删除文件 用于删除filePathAndName参数中定义的文件。 |
0x03 | 替换文件 用于替换(下载)filePathAndName参数中定义的文件。如果文件不在指定位置,则应添加该文件。 |
0x04 | 读取文件 用于读取(上传)filePathAndName参数定义位置的文件。 |
0x05 | 读取目录 用于读取filePathAndName参数中定义的目录。此值意味着请求不包含文件名。 |
0x06 - 0xFF | ISO/SAE保留 |
filePathAndNameLength:定义了文件路径和名称参数(filePathAndName)的长度,以字节为单位。
filePathAndName:定义了目标ECU文件系统中文件的位置,以及文件的名称。根据modeOfOperation参数的不同,这个文件可以是将要被添加、删除、替换或读取的文件。如果modeOfOperation等于0x05(ReadDir),则这个参数指示将要被读取的目录。这个参数的每个字节都应以ASCII格式编码。
dataFormatIdentifier:高半字节(nibble)指定压缩方法,低半字节指定加密方法。值0x00表示既不使用压缩也不使用加密。其他值由车辆制造商定义。如果modeOfOperation等于0x02(DeleteFile)或0x05(ReadDir),则这个参数不应包含在请求消息中。
fileSizeParameterLength:这个参数定义了未压缩文件大小(fileSizeUncompressed)和压缩文件大小(fileSizeCompressed)参数的长度,以字节为单位。如果modeOfOperation等于0x02(DeleteFile)、0x04(ReadFile)或0x05(ReadDir),则这个参数不应包含在请求消息中。
fileSizeUncompressed:定义了未压缩文件的大小,以字节为单位。如果modeOfOperation等于0x02(DeleteFile)、0x04(ReadFile)或0x05(ReadDir),则这个参数不应包含在请求消息中。
fileSizeCompressed:这个参数定义了压缩文件的大小,以字节为单位。如果传输的是未压缩文件,则这个参数的所有字节应设置为与fileSizeUncompressed参数相同的大小信息。如果modeOfOperation等于0x02(DeleteFile)、0x04(ReadFile)或0x05(ReadDir),则这个参数不应包含在请求消息中。
2.2 服务响应格式
2.2.1 肯定响应
modeOfOperation:回显请求消息中的值,反映了Tester请求的操作类型。
lengthFormatIdentifier:定义了maxNumberOfBlockLength参数的长度(以字节为单位)。如果modeOfOperation参数等于0x02(DeleteFile),则这个参数不应包含在响应消息中。
maxNumberOfBlockLength:用于在请求FileTransfer的正响应消息中通知Tester,在每个TransferData请求消息中应包含多少数据字节(maxNumberOfBlockLength),或者在数据上传时,目标ECU将在每个TransferData正响应中包含多少数据字节。这个长度反映了包括服务标识符(SID)和TransferData请求消息或正响应消息中的数据参数在内的完整消息长度。
该参数允许Tester在开始向目标ECU传输数据之前适应目标ECU的接收缓冲区大小,或者指示在数据上传时将在每个TransferData正响应中包含多少数据字节。目标ECU必须接受长度等于其报告的maxNumberOfBlockLength的TransferData请求。目标ECU特定于接受小于maxNumberOfBlockLength的TransferData请求长度(如果有)。
Tip📌:在给定块内的最后一个TransferData请求可能需要小于maxNumberOfBlockLength。不允许目标ECU写入未包含在TransferData消息中的额外数据字节(即填充字节),因为这会影响后续TransferData请求数据将被写入的内存地址。
此外,如果modeOfOperation参数等于0x02(DeleteFile),则这个参数不应包含在响应消息中。
dataFormatIdentifier:回显请求消息中的值。如果modeOfOperation参数等于0x02(DeleteFile),则这个参数不应包含在响应消息中。如果modeOfOperation参数等于0x05(ReadDir),则这个参数的值应等于0x00。
fileSizeOrDirInfoParameterLength:这个参数定义了fileSizeUncompressedOrDirInfoLength和fileSizeCompressed参数的长度,以字节为单位。如果modeOfOperation参数等于0x01(AddFile)、0x02(DeleteFile)或0x03(ReplaceFile),则这个参数不应包含在响应消息中。
fileSizeUncompressedOrDirInfoLength:定义了将要上传的未压缩文件的大小,或者将要读取的目录信息的长度,以字节为单位。如果modeOfOperation参数等于0x01(AddFile)、0x02(DeleteFile)或0x03(ReplaceFile),则这个参数不应包含在响应消息中。
fileSizeCompressed:定义了压缩文件的大小,以字节为单位。如果modeOfOperation参数等于0x01(AddFile)、0x02(DeleteFile)、0x03(ReplaceFile)或0x05(ReadDir),则这个参数不应包含在响应消息中。
2.2.2 否定响应
可能出现的NRC及其含义如下:
NRC | 含义 |
---|---|
0x13 | 消息长度错误 |
0x22 | 当前条件不满足 |
0x31 | 请求参数不受支持,参数错误 |
0x33 | 未通过安全访问 |
0x70 | 由于某些故障导致无法上传目标ECU的数据到Tester中 |
NRC的处理流程如下所示(即推荐的错误情况检查顺序):
三、通信示例
这个示例仅限于描述 RequestFileTransfer
请求和其正响应。即不包括 TransferData
和 RequestTransferExit
服务的具体使用。在 RequestFileTransfer
的上下文中,TransferData
和 RequestTransferExit
服务的使用方式与在 RequestDownload
或 RequestUpload
服务中的使用方式相同。
提前假定如下信息:
==========> Tester发送请求:
==========> 目标ECU发送正响应:
>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<