pduInfo = "DisableCommunicat...",
reqDataString = "28 01 01 ",
rspDataString = "68 ",
postFunc = 0
},
{
addrMode = 'P',
prevFunc = 0,
pduInfo = "To ProgrammingSession...",
reqDataString = "10 02 ",
rspDataString = "50 ",
postFunc = 0
},
{
addrMode = 'P',
prevFunc = 0,
pduInfo = "RequestSeed...",
reqDataString = "27 11 ",
rspDataString = "67 ",
postFunc = REQUEST_SEED_POST
},
{
addrMode = 'P',
prevFunc = SEND_KEY_PREV,
pduInfo = "SendKey...",
reqDataString = "27 12 00 00 00 00 ",
rspDataString = "67 ",
postFunc = 0
},
{
addrMode = 'P',
prevFunc = 0,
pduInfo = "RequestDownloadFlashDriver...",
reqDataString = "34 00 44 00 00 04 00 00 00 00 40 ",
rspDataString = "74 "
},
{
addrMode = 'P',
prevFunc = TRANS_DATA_DRIVER_PREV,
pduInfo = "TransferData...",
reqDataString = "36 01 FF FF ",
rspDataString = "76 ",
postFunc = 0
},
{
addrMode = 'P',
prevFunc = 0,
pduInfo = "TransferExit...",
reqDataString = "37 ",
rspDataString = "77 ",
postFunc = 0
},
{
addrMode = 'P',
prevFunc = CHECK_DRIVER_PREV,
pduInfo = "CheckRoutine...",
reqDataString = "31 01 02 02 00 00 00 00",
rspDataString = "71 ",
postFunc = 0
},
{
addrMode = 'P',
prevFunc = 0,
pduInfo = "EraseMemory...",
reqDataString = "31 01 FF 00 44 00 3E 80 00 00 01 70 00 ",
rspDataString = "71 "
},
{
addrMode = 'P',
prevFunc = 0,
pduInfo = "HardReset...",
reqDataString = "11 01 ",
rspDataString = "51 ",
postFunc = 0
},
{
addrMode = 'F',
prevFunc = 0,
pduInfo = "To ExtSession...",
reqDataString = "10 03 ",
rspDataString = "",
postFunc = 0
},
{
addrMode = 'F',
prevFunc = 0,
pduInfo = "EnableCommunicat...",
reqDataString = "28 00 01 ",
rspDataString = "",
postFunc = 0
},
{
addrMode = 'F',
prevFunc = 0,
pduInfo = "DTCSetting=on...",
reqDataString = "85 01 ",
rspDataString = "",
postFunc = 0
},
{
addrMode = 'F',
prevFunc = 0,
pduInfo = "To DefSession...",
reqDataString = "10 01 ",
rspDataString = "",
postFunc = 0
}
};
byte driverdata[100] =
{
};
}
dword crc32(byte data[], dword len) { return crc ; }
int userMemCmp(byte cs[], byte ct[], dword count) { dword i; int ret;
ret = 0;
for(i = 0; i < count; i++)
if((ret = cs[i]-ct[i]) != 0)
break;
return ret;
}
void DownAppProcess(void) { byte i; long result, replyOk; char info[80]; byte reqData[1024+16]; dword reqLen, sendLen; byte seedArray[4], keyArray[4]; dword crc; dword maxSize; dword seqNo, offset; dword expertLen; byte expertData[20];
@Pannel::ProgressBarPos = 0;
maxSize = 1024;
seqNo = 0;
crc = 0;
offset = 0;
expertLen = 0;
cantpHandle = CanTpCreateConnection(0); // 0 = Normal mode
CanTpSetTxIdentifier(cantpHandle, physTx); // Tx CAN-ID
CanTpSetRxIdentifier(cantpHandle, respRx); // Rx CAN-ID
CanTpSetPadding(cantpHandle, cantpPadding);
for(i = 0; i < 25; i++)
{
strncpy(info, reqPduList[i].pduInfo, elCount(reqPduList[i].pduInfo));
strncat(info, "start", elCount(info)-1);
write(info);
reqLen = str2data(reqPduList[i].reqDataString, reqData);
// prev data process
switch(reqPduList[i].prevFunc)
{
case SEND_KEY_PREV:
getKey(0x11, seedArray, keyArray);
reqData[2] = keyArray[0];
reqData[3] = keyArray[1];
reqData[4] = keyArray[2];
reqData[5] = keyArray[3];
reqLen = 6;
break;
case TRANS_DATA_DRIVER_PREV:
reqLen = elCount(driverdata);
break;
case CHECK_DRIVER_PREV:
crc = crc32(driverdata, elCount(driverdata));
//string2byte(cmd, cmddata, &cmdlen);
reqData[0] = 0x31;
reqData[1] = 0x01;
reqData[2] = 0x02;
reqData[3] = 0x02;
reqData[4] = crc>>24;
reqData[5] = crc>>16;
reqData[6] = crc>>8;
reqData[7] = crc;
reqLen = 8;
break;
case TRANS_DATA_APP_PREV:
reqLen = file.maxAddr-file.minAddr+1;
break;
case CHECK_APP_PREV:
crc = crc32(file.segData, (file.maxAddr-file.minAddr+1));
reqData[0] = 0x31;
reqData[1] = 0x01;
reqData[2] = 0x02;
reqData[3] = 0x02;
reqData[4] = crc>>24;
reqData[5] = crc>>16;
reqData[6] = crc>>8;
reqData[7] = crc;
reqLen = 8;
break;
default:
break;
}
seqNo = 1;
while(reqLen > 0)
{
if(reqLen >= maxSize)
{
sendLen = maxSize;
}
else
{
sendLen = reqLen;
}
if(reqPduList[i].prevFunc == TRANS_DATA_DRIVER_PREV)
{
reqData[0] = 0x36;
reqData[1] = 0x01;
memcpy_off(reqData, 2, driverdata, 0, elCount(driverdata));
result = CanTpTransmit(reqPduList[i].addrMode, reqData, sendLen+2, 500, 5000);
if(repeatSend == 1 && result == 0) // timeout repeat send
{
testwaitfortimeout(50);
result = CanTpTransmit(reqPduList[i].addrMode, reqData, sendLen+2, 500, 5000);
}
}
else if(reqPduList[i].prevFunc == TRANS_DATA_APP_PREV)
{
reqData[0] = 0x36;
reqData[1] = seqNo++;
memcpy_off(reqData, 2, file.segData, offset, sendLen);
result = CanTpTransmit(reqPduList[i].addrMode, reqData, sendLen+2, 500, 5000);
if(repeatSend == 1 && result == 0)
{
testwaitfortimeout(50);
result = CanTpTransmit(reqPduList[i].addrMode, reqData, sendLen+2, 500, 5000);
}
offset += sendLen;
}
else
{
result = CanTpTransmit(reqPduList[i].addrMode, reqData, sendLen, 500, 5000);
if(repeatSend == 1 && result == 0) // timeout repeat send
{
testwaitfortimeout(50);
result = CanTpTransmit(reqPduList[i].addrMode, reqData, sendLen, 500, 5000);
}
}
if(@Pannel::ProgressBarPos < 150)
{
@Pannel::ProgressBarPos = @Pannel::ProgressBarPos+1;
}
expertLen = str2data(reqPduList[i].rspDataString, expertData);
if((rspLen >= expertLen) && userMemCmp(expertData, rspData, expertLen) == 0)
{
}
else
{
//strncpy(info, reqPduList[i].pduInfo, elCount(reqPduList[i].pduInfo));
//strncat(info, "-------------err--------------", elCount(info)-1);
//write(info);
write("-------------err--------------");
SysSetVariableString(sysvar::Pannel::Info, "-------------ERROR--------------");
//mmsndPlay("track03.mp3", 5000);
{
char SoundFilesPath[256];
int kStringLen = 256;
getAbsFilePath("", SoundFilesPath, kStringLen);
mmsndSetMediaPath(SoundFilesPath);
mmsndPlay("track03.mp3", 0);
}
return;
}
reqLen -= sendLen;
}
// post data process
switch(reqPduList[i].prevFunc)
{
case REQUEST_SEED_POST:
seedArray[0] = rspData[2];
seedArray[1] = rspData[3];
seedArray[2] = rspData[4];
seedArray[3] = rspData[5];
break;
case REQUEST_DOWN_APP_POST:
maxSize = (rspData[2] << 8) + rspData[3] - 2;
break;
default:
break;
}
strncpy(info, reqPduList[i].pduInfo, elCount(reqPduList[i].pduInfo));
strncat(info, "end", elCount(info)-1);
write(info);
testwaitfortimeout(500);
}
@Pannel::ProgressBarPos = 150;
SysSetVariableString(sysvar::Pannel::Info, "-------------SUCCESS--------------");
}
void CanTp_ReceptionInd(long connHandle, byte data[]) { //write("Recv handle %d, data %x", connHandle, data[0]); memcpy(rspData, data, elCount(data)); rspLen = elCount(data);
TestSupplyTextEvent(rspEvent);
}
CanTp_ErrorInd( long connHandle, long error)
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!