Fork me on GitHub

CAN/CANFD诊断:CANTP

can测试诊断方式

  • output
  • TP链接及相关API(本文内容)
  • CDD文件及相关API

常规诊断报文缩写

can诊断服务一览

时间参数(unit:ms)

 

传输层 BS ECU发送流控帧后,Tester被允许发送连续帧最大帧数目
STmin ECU发送流控帧后,Tester被允许发送连续帧的最大帧间隔
网络层 N_As Tester传输CAN数据帧至ECU的最大时间
N_Bs Tester首帧发送成功后到流控帧接收成功的最大时间
N_Cs Tester在接收流控帧后到发送连续帧的最大时间
N_Ar ECU传输流控帧至Tester的最大时间
N_Br ECU接收到首帧到开始发送流控帧的时间
N_Cr ECU成功发送流控帧后到收到连续帧的最大时间
会话层 S3_Tester Tester为了保持一个ECU或者多个ECU节点同时保持在非默认会话下的时间间隔
S3_Sever ECU未接收到任意诊断报文时维持在非默认会话下的时间间隔
应用层 P2_Client Tester成功发送完请求消息后等待服务器响应超时设置
P2*_Client Tester接收到否定响应码为0x78的否定响应后等待ECU发送响应时的增强型超时设置
P2_Sever ECU收到请求后发出响应的实际时间
P2*_Sever ECU发送0x78否定响应到发出响应的实际时间
P3_ClientPyh Tester在收到物理寻址的肯定响应下允许发送下一条物理寻址请求的最小时间间隔
P3_ClientFun Tester在收到功能寻址的肯定响应下允许发送下一条功能寻址请求的最小时间间隔

步骤一:初始化TP层参数及定义

1.1  创建链接:关闭上一次得链接

CloseCANConnection()

1.2  创建链接:获取并设置当前CAN通道定义

Context = GetBusNameContext(canbusName);//工程配置的canname--ECU所在网段
setBusContext(Context);
CanTpSetMaximumReceiveLength(Handle,CANTPMaxLength);//一般为8
CanTpSetBitRateSwitch(1);//CAN-0 CANFD--1

1.3  创建链接:获取系统分配的句柄

gConnHandle = CanTpCreateConnection(0); //addrmodel:normal

1.4  创建链接:设置发送/接收寻址ID

CanTpSetTxIdentifier( gConnHandle, txId);//功能寻址0x7DF/0x7FF,物理寻址0x731可能不一样
CanTpSetRxIdentifier( gConnHandle, rxId);//每个ECU不一样

1.5  TP层参数配置

CanTpSetTimeBr(gConnHandle,70);
CanTpSetTimeoutAr(gConnHandle,70);
CanTpSetTimeoutCr(gConnHandle,150);
CanTpSetTimeoutAs(gConnHandle,70);
CanTpSetTimeoutBs(gConnHandle,150);
CanTpSetTimeCs(gConnHandle,150);
CanTpSetPadding(gConnHandle, 0x00);
CanTpSetMaximumReceiveLength(gConnHandle,4095);//最大TP接收长度设置

1.6  流控帧配置

//接收方
CanTpUseFlowControlFrames(gConnHandle, 1);
CanTpIsUseFlowControlFrames(gConnHandle);
CanTpSetSTmin(gConnHandle,0x00);//CanTpGetSTmin(gConnHandle)
CanTpSetBlockSize(gConnHandle,0);
CanTpSetFlowControlDelay(gConnHandle,10);
//发送方
CanTpUseFlowControlBlockSize(gConnHandle, 1);
CanTpUseFlowControlSTmin(gConnHandle, 1);

步骤二:诊断报文发送(单帧)

2.1  数据组包(例DTC)

void RequestDTC(byte DTCsubfunction,byte DTCStauts)
{
  gTxBuffer[0] = 0x19;
  gTxBuffer[1] = DTCsubfunction;
  gTxBuffer[2] = DTCStauts;
  gTxBufferLen = 3;
}

2.2  诊断请求

CanTpSetTxIdentifier(gConnHandle,reqID/*寻址方式*/);//再次设置请求ID以防万一
CanTpSendData(gConnHandle,gTxBuffer,pduLength);

3.3  诊断接收

CanTp_ReceptionInd(gConnHandle,gRxBuffer);//linUpdateResponse(linFrame frame); 

4.4  诊断报文判断

while(counter<=超时时间)
{
    if(肯定响应抑制)
    {
        if(没有收到肯定响应)
            true;
        else
            flase;
    }
    else
    {
        if(收到肯定响应)
        {
            if(响应长度正确 && 响应内容正确)
                true;
            else    
                flase;
        }
        else
            flase;
    }
    sleepms(1);
    counter++;
}

步骤三:报文内容发送(多帧)

参考链接1:https://blog.csdn.net/qq_42718749/article/details/106287590

参考链接2:https://blog.csdn.net/LOVE135149/article/details/122614388

参考链接3:https://blog.csdn.net/weixin_47890316/article/details/106167385

posted @ 2022-08-31 18:02  张一默  阅读(3394)  评论(0编辑  收藏  举报