既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
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)
{
}
long CanTpTransmit(byte addrMode, byte reqData[], dword reqLen, long timeOut, long timeOutPending)
{
byte data[20], data2[20];
long ret, result, pending;
rspLen = 0;
if(addrMode == 'P')
{
CanTpSetTxIdentifier(cantpHandle, physTx);
}
else
{
CanTpSetTxIdentifier(cantpHandle, funcTx);
}
testWaitForTimeout(20);
CanTpSendData(cantpHandle, reqData, reqLen);
pending = 0;
do
{
result = testWaitForTextEvent(rspEvent, timeOut);
if(result == 0) // Resume due to timeout
{
ret = result;
rspLen = 0;
break;
}
else // Resume due to event occurred
{
if(rspLen == 3 && rspData[0] == 0x7F && rspData[1] == reqData[0] && rspData[2] == 0x78)
{
timeOut = timeOutPending;
rspLen = 0;
continue;
}
else
{
ret = result;
break;
}
}
}while(1);
return ret;
}
![img](https://img-blog.csdnimg.cn/img_convert/2fb5dbbe408893376cef98c1ec040d23.png)
![img](https://img-blog.csdnimg.cn/img_convert/5e35da241d916c701b487aa13d44cf12.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
3699631)]
[外链图片转存中...(img-PufhDvKy-1715863699631)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**