

![]() |
传输层 | 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在收到功能寻址的肯定响应下允许发送下一条功能寻址请求的最小时间间隔 |
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
我已经像这样安装了一个新的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="
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|
最近在学习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总线个人知识总
我编写了一个非常简单的“部署”脚本,作为我的裸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
在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
我有代码: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`[]'
我需要能够确定我的Ruby项目中的csv文件中使用了哪个分隔符(逗号、空格或分号)。我知道,csv模块中的Python中有一个Sniffer类,可用于猜测给定文件的分隔符。Ruby中有类似的东西吗?非常感谢任何形式的帮助或想法。 最佳答案 看起来py实现只检查几种方言:excel或excel_tab。因此,仅检查","或"\t"的简单实现是:COMMON_DELIMITERS=['","',"\"\t\""].freezedefsniff(path)first_line=File.open(path).firstreturnunle
我在使用session变量时遇到问题。我有两个名为“graduate_students_controller”和“current_students_controller”的Controller。这些Controller中的每一个都控制不同的View文件。我在这两个Controller中使用session变量来存储session信息。问题来了。假设我有两个View文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件都由上述Controller单独控制。现在,如果我尝试从同一浏览器中打开这两个网页并尝
我希望我的后台作业能够内联运行某些标记测试。我可以通过用perform_enqueueddo包装测试来做到这一点,但我希望能够用元数据标记它们,如果可能的话,它会自动发生。我试过以下方法:it"doeseverythinginthejobtoo",perform_enqueued:truedoendconfig.around(:each)do|example|ifexample.metadata[:perform_enqueued]perform_enqueued_jobsdoexample.runendendend但它会导致错误:undefinedmethod`perform_enq
在ruby中,begin#...rescue#...end不会捕获不是StandardError子类的异常。在C中,rb_rescue(x,Qnil,y,Qnil);VALUEx(void){/*...*/returnQnil;}VALUEy(void){/*...*/returnQnil;}会做同样的事情。我如何从rubyC扩展中rescueException=>e(而不仅仅是rescue=>e)? 最佳答案 Ruby需要更多文档。我不得不进入ruby源代码,这是我发现的:VALUErb_rescue(VALUE(*b_p