大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断传输数据0X36服务介绍,希望能对你有所帮助 。
一、传输数据服务介绍
0X36服务就是用来传输数据的,当执行了请求下载服务(0X34)或请求上传服务(0X35)时,就会用到0X36服务。
数据传输的方向由请求下载服务(0X34)或请求上传服务(0X35)决定,如果客户端发起了请求下载服务(0X34),数据传输方向为客户端到服务器,要下载的数据包含在0X36服务 请求消息中的参数 transferRequestParamete中;
如果客户端发起了请求上传服务(0X35),数据传输方向为服务器到客户端,要上传的数据在0X36服务 响应消息中的参数 transferResponseParameter中。
TransferData服务请求包括一个blockSequenceCounter,以便在多个传输数据的序列中,如果传输数据服务失败,可以改进错误处理。 当接收到请求下载(0x34), 请求上传(0x35)或请求文件传输(0x38)的请求消息时(这里以0x34服务为准),服务器的blockSequenceCounter应该初始化为1。
这意味着在请求下载(0x34), 请求上传(0x35)或请求文件传输(0x38)请求消息之后的第一个数据传输(0x36)请求消息中,块序列计数器的值为1
二、数据格式介绍
2.1 请求报文
格式:
[SID] + [blockSequenceCounter] + [transferRequestParameterRecord]
这个服务也是没有子功能这个参数的
参数介绍:
1)数据块顺序计数值(blockSequenceCounter)
blockSequenceCounter参数值从0x01开始,是请求下载(0x34), 请求上传(0x35)或请求文件传输(0x38)服务之后的第一个TransferData请求。对于每个后续的TransferData请求,其值递增1。递增到0xFF时,blockSequenceCounter又从0x00开始发送下一个TransferData请求消息
示例:
a)如果下载数据的TransferData请求在服务器中被正确接收和处理,但是积极的响应消息没有到达客户端,那么客户端将确定一个应用层超时,并将重复相同的请求(包括相同的blockSequenceCounter)。服务器将接收重复的TransferData请求,并可以根据包含的blockSequenceCounter确定此TransferData请求是否重复。服务器将立即发送积极响应消息,而无需再次将数据写入其内存。
b)如果服务器没有正确地接收到下载数据的TransferData请求,那么服务器将不会发送积极的响应消息。客户端将确定一个应用层超时,并重复相同的请求(包括相同的blockSequenceCounter)。服务器将接收重复的TransferData请求,并可以根据包含的blockSequenceCounter确定这是一个新的TransferData。服务器将处理服务并发送正响应消息。
c)如果上传数据的TransferData请求在服务器中被正确接收和处理,但积极的响应消息没有到达客户端,那么客户端将确定一个应用层超时,并将重复相同的请求(包括相同的blockSequenceCounter)。服务器将接收重复的TransferData请求,并可以根据包含的blockSequenceCounter确定此TransferData请求是否重复。服务器将立即发送积极的响应消息,再次访问其内存中先前提供的数据。
d)如果服务器没有正确接收到上传数据的TransferData请求,那么服务器将不会发送积极的响应消息。客户端将确定一个应用层超时,并重复相同的请求(包括相同的blockSequenceCounter)。服务器将接收重复的TransferData请求,并可以根据包含的blockSequenceCounter确定这是一个新的TransferData。服务器将处理服务并发送正响应消息。
2)传输请求参数记录(transferRequestParameterRecord)
此参数记录包含服务器支持数据传输所需的参数。该参数的格式和长度由汽车制造商指定。
示例:对于下载,transferRequestParameterRecord包含要传输的数据
2.2 响应报文
肯定响应
报文格式:
[SID + 0X40] + [blockSequenceCounter] + [transferResponseParameterRecord]
block Sequence Counter:这个和请求消息中的保持一致就行
transferResponseParameterReco rd:这个如果前面是上传服务,则这个参数是必须的,是包含要上传的数据;如果前面是下载服务,这个参数是可选项,可以是下载数据的校验和。
否定响应:
格式:[0X7F] + [SID] + [NRC]
支持的NRC
三、举例
看个实际的例子:
0x102是这一个block要传输的数据字节数,36 后面的01是数据块序列计数器,01后面的就是要传输的实际内容了
回复的正响应是:76 01,此处没有传数据的校验和,具体的看项目的实际需求,有些项目可能需要传输校验和。
来源:嵌入式老林
谢谢分享