收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
const byte cantpPadding = 0xAA;
struct fileInfo
{
long fileHandle;
char filePath[512];
dword maxAddr;
dword minAddr;
dword segNum;
dword segAddr[20];
dword segLen[20];
dword segOffset[20];
byte segData[1 * 1024 * 1024];
};
struct reqPDU
{
byte addrMode;
long prevFunc;
char pduInfo[50];
char reqDataString[80];
char rspDataString[80];
long postFunc;
};
struct fileInfo file;
enum funcDef
{
REQUEST_SEED_POST = 0,
SEND_KEY_PREV,
TRANS_DATA_DRIVER_PREV,
CHECK_DRIVER_PREV,
REQUEST_DOWN_APP_POST,
TRANS_DATA_APP_PREV,
CHECK_APP_PREV
};
struct reqPDU reqPduList[20] =
{
{
addrMode = 'F',
prevFunc = 0,
pduInfo = "To ExtSession...",
reqDataString = "10 03 ",
rspDataString = "50 ",
postFunc = 0
},
{
addrMode = 'F',
prevFunc = 0,
pduInfo = "DTCSetting=off...",
reqDataString = "85 02 ",
rspDataString = "C5 "
},
{
addrMode = 'F',
prevFunc = 0,
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;
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
qLen;
[外链图片转存中…(img-VkxrOPgV-1715719335088)]
[外链图片转存中…(img-S0t1ZEvP-1715719335088)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新