最全CAPL实现UDS下载框架_capl 下载服务,插件化框架解读之物联网嵌入式开发系统服务实现原理

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

qLen;

[外链图片转存中…(img-VkxrOPgV-1715719335088)]
[外链图片转存中…(img-S0t1ZEvP-1715719335088)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值