目录
前言
36服务是bootloader刷写app时常用的一个诊断服务。本文将介绍36服务在CAPL中常使用的一些函数。
36服务的作用
客户端利用TransferData(传输数据)服务从客户端向服务器(下载)或从服务器向客户端(上传)传输数据。
36服务的请求格式
查看ISO 14229-1可知道$36的请求格式:

由表格可知$36由3部分组成:
1.诊断服务请求ID,该部分为固定值0x36。
2.blockSequenceCounter,由于传输数据量一般都很大,需要多次使用$36才能完成所有数据的传输,该参数表示所有数据被分割后的序号。
3.transferRequestParameterRecord[],该参数为一个数组,包含每次需要传输的数据。
36服务在CAPL中的常用函数
以下介绍$36在CAPL中实现的常用方法。
variables
{
/*TransferData*/
DiagRequest Diagnostic.Download_Transmit DiagReq_36_TransferData;
byte DataBuffer[0x7FFFFF];
}
diagSetParameter(DiagReq_36_TransferData, "BlockSequenceCounter", sequence_num);
diagSetParameterRaw(DiagReq_36_TransferData, "TransferRequestParameterRecord", DataBuffer,DataBuffer_len);
diagSendRequest(DiagReq_36_TransferData);
下面对各部分进行解读:
1. 变量声明
variables
{
/*TransferData*/
DiagRequest Diagnostic.Download_Transmit DiagReq_36_TransferData;
byte DataBuffer[0x7FFFFF];
}
- DiagRequest Diagnostic.Download_Transmit DiagReq_36_TransferData;
在variables部分对$36声明,定义诊断请求对象,对应UDS服务0x36 (TransferData)。
其中Diagnostic.Download_Transmit 是在cdd中定义的服务快捷方式限定符。
- byte DataBuffer[0x7FFFFF];
用于缓存下载数据的缓存buffer。
2. 设置blockSequenceCounter参数
diagSetParameter(DiagReq_36_TransferData, "BlockSequenceCounter", sequence_num);
当传输数据为标准内容时,使用diagSetParameter()设置发送数据。
BlockSequenceCounter,是标准UDS参数,对应ISO 14229-1可知道$36的请求格式。
sequence_num,表示当前的传输块的序号,需要用户自己维护这个计数器的递增逻辑。
3. 设置发送数据transferRequestParameterRecord[]
diagSetParameterRaw(DiagReq_36_TransferData, "TransferRequestParameterRecord", DataBuffer,Cur_DataBuffer_len);
当包含自定义数据内容时,使用diagSetParameterRaw()设置发送数据。
TransferRequestParameterRecord,是标准UDS参数,对应ISO 14229-1可知道$36的请求格式。
DataBuffer,是一个数据缓存数组,用于保存当前待传输数据。
Cur_DataBuffer_len,对应当前待传输数据的长度。
4. 发送单次$36数据
diagSendRequest(DiagReq_36_TransferData);
以上三步设置好$36所有需要填充的数据,使用diagSendRequest()发送$36的数据。
总结
在了解$36的请求格式后,可在CAPL中按照其格式要求,传输所有数据。


1491

被折叠的 条评论
为什么被折叠?



