大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断请求下载0X34服务介绍,希望能对你有所帮助 。
一、请求下载服务介绍
0X34请求下载服务( Request Download ), 客户端使用请求下载服务启动从客户端到服务器的数据传输(下载)。
在服务器接收到requestDownload请求消息后,服务器应在发送积极响应消息之前采取所有必要的操作来接收数据。
简单点介绍,就是0x34服务主要是用来下载的,一般在boot下UDS升级会用到
二、数据格式
2.1 请求报文
格式:
[SID] + [dataFormatIdentifier] + [addressAndLengthFormatIdentifier] + [memoryAddress] + [memorySize]
这个服务也是没有子功能这个参数的
对每个参数介绍一下:
1)SID:这个应该很熟悉了,没什么可说的,service ID服务ID
2)dataFormatIdentifier:数据格式标识符,占一个字节,主要是用来表示下载的数据是否需要加密和压缩。每半字节单独定义。高字节定义“压缩方式”,低字节定义“加密方式”。00h 表示不压缩不加密。非 00 的值由主机厂自定义,具体看客户需求
3) addressAndLengthFormatIdentifier: 地址和长度格式标识符
该参数是一个一字节的值,每半字节单独定义。
— bit 7 – 4: 内存大小长度(字节数)参数;
— bit 3 – 0: 内存地址长度(字节数)参数;
4) memoryAddress: 内存地址
内存地址是要写入数据的服务器内存起始地址。该地址字节数由“地址和长度格式标识符”的低半字节(bit 3 – 0)定义。内存地址中的字节#m 总是地址的最低字节。地址的最高字节可用作一个内存标识符。
内存标识符可用在具有 16 位寻址和内存地址重叠的双处理器服务器中(当一个给定的地址对于产生不同物理内存装置的处理器有效或者对于使用的内外部 Flash 有效时)。 在这种情况下,内存地址参数中未使用的字节可定义为内存标识符,用来选择期望的内存装置。
5) memorySize: 内存大小(无压缩的内存大小)
内存地址参数表明要写入的数据是多少字节。在请求传送数据服务期间,服务器用该参数与实际传输的字节总数相比较,这样增加了刷新的安全性。该参数的字节长度由地址和长度格式标识符(addressAndLengthFormatIdentifier)的高半字节(bit 7 – 4)定义
2.2 响应报文
肯定响应 :
报文格式:
[SID + 0X40] + [lengthFormatIdentifier] + [maxNumberOfBlockLength]
1)lengthFormatIdentifier:长度格式标识符
该参数是一个一字节的值,每半字节单独定义。
—bit 7 – 4:最大数据块长度的长度(字节数)参数;
—bit 3 – 0:预留, 默认值为十六进制 0 .
该参数的格式与请求信息中的地址和长度格式标识符( addressAndLengthFormatIdentifierparameter)一致,除了低半字节为默认的十六进制 0 外。
2)maxNumberOfBlockLength:最大数据块长度
该参数是服务器在请求下载(0x34)的肯定响应中告诉诊断设备在每次数据传输服务请求(0x36)应有多少字节(最大数据块长度)可以传输。该信息反映完整的消息长度,包括在传输数据请求(0x36)信息中出现的服务标识符和数据参数。该参数要求诊断设备在开始向服务器传输数据之前适应服务器接收缓冲区的大小。服务器接收的由传输数据请求(0x36)传输的数据长度需等于服务器报告的最大数据块长度。传输数据请求(0x36)传输的数据长度少于最大数据块长度多少数值可以接受,由服务器来确定。注意:最后一个传输数据请求(0x36)传输的数据块长度可以少于最大数据块长度。服务器不允许诊断设备向其中写入不包含在传输数据信息(压缩格式或者未压缩格式)中的额外字节(例如填充字节),因为这会影响随后请求写入数据的内存地址。
否定响应
格式:[0X7F] + [SID] + [NRC]
2.3 支持的NRC
支持的NRC:
如果对NRC还不清楚的,可以看看之前的一篇文章: 一文搞懂UDS的各种NRC
NRC处理的优先级如下
三、举例
看个实际的例子:
34后面的0X00,表示 数据格式标识符,不压缩也不加密,0X44表示后面的内存地址和长度都为4个字节,后面分别跟要刷写的内存地址,要传输数据的总字节数
回复的正响应:04 74 20 01 02 AA AA AA
20:表示最大数据的字节数为2字节
01 02:最大数据块的字节数,就是36服务每包数据能传输的最大字节数 。
谢谢分享