can测试诊断方式
- output
- TP链接及相关API(本文内容)
- CDD文件及相关API
时间参数列表(unit:ms)
传输层时间参数 | BS | ECU发送FC后,Tester被允许发送连续帧最大帧数目 |
STmin | ECU发送FC后,Tester被允许发送连续帧的最大帧间隔 | |
网络层时间参数 | N_As | Tester传输CAN数据帧至ECU的最大时间 |
N_Bs | Tester首帧发送成功后到流控帧接收成功的最大时间 | |
N_Cs | Tester在接收流控制后到发送连续帧的最大时间 | |
N_Ar | ECU传输流控帧至ECU的最大时间 | |
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);
1.3 创建链接:获取系统分配的句柄
gConnHandle = CanTpCreateConnection(0); //addrmodel:normal
1.4 创建链接:设置发送/接收诊断报文ID
CanTpSetTxIdentifier( gConnHandle, txId);
CanTpSetRxIdentifier( gConnHandle, rxId);
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
标签:发送,Tester,CANFD,TP,gConnHandle,ECU,传输层,链接 From: https://www.cnblogs.com/YiMo9929/p/16644080.html