草庐IT

CAN/CANFD诊断:CANTP

张一默的菜园子 2023-03-28 原文

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

有关CAN/CANFD诊断:CANTP的更多相关文章

  1. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  2. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  5. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

  6. ruby - 类型错误 : can't convert String into Integer - 2

    我有代码:classScenedefinitialize(number)@number=numberendattr_reader:numberendscenes=[Scene.new("one"),Scene.new("one"),Scene.new("two"),Scene.new("one")]groups=scenes.inject({})do|new_hash,scene|new_hash[scene.number]=[]ifnew_hash[scene.number].nil?new_hash[scene.number]当我启动它时出现错误:freq.rb:11:in`[]'

  7. ruby : How can I detect/intelligently guess the delimiter used in a CSV file? - 2

    我需要能够确定我的Ruby项目中的csv文件中使用了哪个分隔符(逗号、空格或分号)。我知道,csv模块中的Python中有一个Sniffer类,可用于猜测给定文件的分隔符。Ruby中有类似的东西吗?非常感谢任何形式的帮助或想法。 最佳答案 看起来py实现只检查几种方言:excel或excel_tab。因此,仅检查","或"\t"的简单实现是:COMMON_DELIMITERS=['","',"\"\t\""].freezedefsniff(path)first_line=File.open(path).firstreturnunle

  8. ruby-on-rails - rails : How can you access session variables using multiple controllers? - 2

    我在使用session变量时遇到问题。我有两个名为“graduate_students_controller”和“current_students_controller”的Controller。这些Controller中的每一个都控制不同的View文件。我在这两个Controller中使用session变量来存储session信息。问题来了。假设我有两个View文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件都由上述Controller单独控制。现在,如果我尝试从同一浏览器中打开这两个网页并尝

  9. ruby-on-rails - rspec rails 测试 : how can I force ActiveJob job's to run inline for certain tests? - 2

    我希望我的后台作业能够内联运行某些标记测试。我可以通过用perform_enqueueddo包装测试来做到这一点,但我希望能够用元数据标记它们,如果可能的话,它会自动发生。我试过以下方法:it"doeseverythinginthejobtoo",perform_enqueued:truedoendconfig.around(:each)do|example|ifexample.metadata[:perform_enqueued]perform_enqueued_jobsdoexample.runendendend但它会导致错误:undefinedmethod`perform_enq

  10. c - Ruby c 扩展 : How can I catch all exceptions, 包括不是 StandardErrors 的东西? - 2

    在ruby中,begin#...rescue#...end不会捕获不是StandardError子类的异常。在C中,rb_rescue(x,Qnil,y,Qnil);VALUEx(void){/*...*/returnQnil;}VALUEy(void){/*...*/returnQnil;}会做同样的事情。我如何从ruby​​C扩展中rescueException=>e(而不仅仅是rescue=>e)? 最佳答案 Ruby需要更多文档。我不得不进入ruby​​源代码,这是我发现的:VALUErb_rescue(VALUE(*b_p

随机推荐