CAPL实现UDS下载框架_capl 下载服务

img
img

既有适合小白学习的零基础资料,也有适合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)**

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值