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
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16644080.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了