代码先锋网 代码片段及技术文章聚合

CAPL实现UDS下载框架

最近在做CAPL实现UDS下载,本下载框架可实现配置修改,提高效率。核心代码如下。

includes
{
    #pragma library (".\Exec32\MMSound.dll")
    #pragma library (".\Exec32\osek_tp.dll")
}

variables
{
    long physHandle;
    long cantpHandle;

    char rspEvent[18] = "Diag Receved!";
    byte rspData[100];
    dword rspLen = 0;
    
    const dword physTx = 0x705;
    const dword funcTx = 0x7DF;
    const dword respRx = 0x785;
    
    const byte repeatSend = 1;
    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;
            }
            
            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;
}

 

版权声明:本文为fz835304205原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fz835304205/article/details/86087047

智能推荐

CANOE CAPL 实现以太网报文发送和接收

CANOE CAPL 实现以太网报文发送和接收 概述 上一片主要讲解以太网的发送,以及如何以HEX形式发送 这一篇主要讲解如何实现多端口发送,多端口接收报文,以及处理报文。 一、 variables { UdpSocket gSocket1;//交流17681826077 UdpSocket gSocket2;//55001 端口 UdpSocket gSocket3;//30001端口 } 宗旨...

根据URL下载文件,C++实现,MFC框架

需要头文件afxinet.h...

基于Django框架实现word填充及下载

work文档 说明 word文档使用python对模板进行填充,对word模板文件的填充依赖于docxtpl插件,文件格式为.docx,填充时,使用类似于jinjia2模板引擎的语法,官方文档中对该插件的使用有详细教程。 插件安装 后端实现 说明 django 1.8版本当中,官方文档对于文件下载的支持,提供了两个类StreamingHttpResponse和 FileResponse,两者的详细...

Java中利用SpringBoot框架实现文件下载功能

直接扔代码!!!!!!!!!!!!!!!!!!!!!!!!!!简单!!!!!!!!!!!!!!!!!!! 需要import的包如下:     测试:浏览器输入 http://localhost:xxxx/download?fileName=a.doc xxxx:后台程序的port a.doc:C盘根目录下的文件...

在SpringMVC框架中实现文件上传和下载

首先在springmvc.xml中配置文件上传的属性 在pom.xml文件中加入上传组件的jar包 这两个xml文件配置完成之后,我们就可以开始来写我们的前端页面和后端的控制器代码了。 我们知道后台接受的类是MultipartFile,我们首先来封装一个文件上传的工具类,将文件上传到系统的指定目录下 上面的代码就可以实现文件的保存了。 下面我们来看看单文件上传和多文件上传的功能如何实现吧! 单文件...

猜你喜欢

SSH框架上传附件及下载功能的实现

使用struts2中的文件上传与下载功能,需要先导入两个jar文件,一个是commons-fileupload.jar,另一个是commons-io.jar。 struts2单文件上传: jsp页面: UserArticleAction.java 接下来就是文件下载功能: UserArticleAction.java struts.xml...

SpringMVC框架实现文件、资源的上传和下载

Spring MVC 上下文中默认没有为文件上传提供了直接的支持,因 此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 CommonsMultipartResovler: 1.文件下载 [1]输入流、输出流原生方法实现 [2]输入流和ResponseEntity实现: 2.文件、资源上传到服务器 [1]通过FileItem实现 [2]使用原生方法实现...

使用EasyPoi实现下载功能---springboot框架

使用EasyPoi实现下载功能---springboot框架 依赖 依赖---EasyPoi的依赖---我们使用3.2.0版本 依赖---Lombok依赖---实体类中实现get/set方法 代码---实体类 代码---controller层 代码---mapper层---为了方便没有使用service及serviceImpl层 代码---SQL数据库表数据 代码---SQL语句 结果---suc...

SpringBoot框架下,前后端实现文件交互——文件下载

上篇介绍了前后端交互的文件上传功能,本篇将继续介绍文件下载功能实现 【前端】 HTML: JS: 【注意】:点击访问文件下载请求后,直接弹出文件的下载模态框,进行下载文件保存。 【后端】: 情形一、返回文件内容(字符串形式) 情形二、返回文件格式,可实现直接下载...