-
请求下载
#1 请求下载SID
#2 数据格式标识符
高效半字节指定“compressionMethod(压缩法)”,
低效半字节指定“encryptingMethod(加密法)”。
字节值0x00不得使用压缩法或加密法。0x00以外的字节值由车辆制造商规定。
#3 地址和长度标识符
bit 3 - 0:参数memoryAddress的长度(Bytes)
bit 7 - 4:参数memorySize的长度(Bytes)
#4~ #(m-1)+4 开始下载数据的起始地址
#n-(k-1) ~#n 内存大小 这个参数用来把传输数据和内存进行对比,这种操作增加了下载数据的安全性
eg.
发送:10 0B 34 00 44 00 00 00 00(起始地址) 00 00 04 98(内存大小) 数据有0x0498 = 1176字节
-
肯定响应
#1 响应SID
#2 长度格式标识符
bit 7 - 4:参数maxNumberOfBlockLength的长度(Bytes)的长度
bit 3 - 0:保留位,设为0
#3 ~#n 一个块的带载能力
这个参数用来通知客户端在每次数据传输请求中包含了多少字节的数据(包括ID和 块号)。
响应
04 74 20 00 82(每次 数据传输包能接收130个字节)
-
否定响应
参考代码
void Service34Handle(uint8_t type, uint16_t length, uint8_t *messageData)
{
g_NRC = PR;
if(length == 11)
{
uint8_t dataFormat = *(MessageData + 1);
uint8_t addLength = *(MessageData + 2);
if(dataFormat == 0 && addLength == 0x44)
{
ProgramAddress = *((uint32_t*)(messageData + 3));
ProgramLength = *((uint32_t*)(messageData + 7));
if(MemValidRange( ProgramAddress,ProgramLength) == 1) //Memary can use
{
if(g_UpdateStep == DOWNLOAD_FLASH_DRIVER_34)
{
DiagnosticBuffTX[0] = (*(MessageData + 1)) + 0x40; //0x74
DiagnosticBuffTX[1] = 0x20;
DiagnosticBuffTX[2] = (uint8_t)(MAX_SIZE >> 8); // can receive max
DiagnosticBuffTX[3] = (uint8_t)(MAX_SIZE);
ResponseLength = 4;
g_BlockIndex = 1; // the first blck is 1
ProgramLengthComplete = 0;
g_UpdateStep = DOWNLOAD_FLASH_DRIVER_36; // next step
}
else
{
g_NRC = RSE; //request sequence error
}
}
}
else
{
g_NRC = IMLOIF; //incorrect message length or invalid format
}
}