问题背景:
在诊断会话层,从发送诊断到响应答复都规定了定时参数,其中有两个P2 server的时间:
- P2CAN_SERVER :俗称短时间,在接受到请求信息后,服务器开始答复信息的运行要求,一般是50ms.
- P2*CAN_SERVER :俗称长时间,服务器在传递了0x78的否定应答码,服务器开始答复信息的运行时间,一般是5000ms.
CANoe 默认状态下,把0x78当成特殊负响应应答码,收到NRC78的时候,会自动将等待应答的时间填充为P2*~CAN_SERVER 时间。
现在我想实现的是,当收服务器返回的0x78时,把它当成一般的NRC处理。
diagSetP2Extended ()
选择 form3 ,下面的解释是:
如果“响应等待”处理被停用,CANoe 将0x78 响应转发到CAPL作为一般消极的响应。否则,P2ex计时器将自动启动,并报告最终响应或超时。
忽视 NRC0x78的响应
req_Reset_All_Parameters_Start
这个服务的响应时间大约在10s,左右,我们这里代码中设置 TestWaitForDiagResponse(req_Reset_All_Parameters_Start,3000);
肯定是不够的,如果禁用掉diagSetP2Extended (),看下输出结果:
// write("DiagSetP2Extended(-1):%d",DiagSetP2Extended(-1));
TestReportWriteDiagObject(req_Reset_All_Parameters_Start);
DiagSendRequest(req_Reset_All_Parameters_Start);
TestWaitForDiagRequestSent(req_Reset_All_Parameters_Start, 150);
retVal = TestWaitForDiagResponse(req_Reset_All_Parameters_Start,3000);
write("TestWaitForDiagResponse():%d",retVal);
write("response size:%ld",diagGetRespPrimitiveSize(req_Reset_All_Parameters_Start));
// write("DiagSetP2Extended(-1):%d",DiagSetP2Extended(0));
输出结果:
TestWaitForDiagResponse():0 //返回结果为0,说明3000ms超时时间到了,但是没有收到 积极或者消极的响应
response size :-98 //也时说明没收到响应
下面的Trace中可以看出,31 01 DC 10的响应时间大概为10s, 当时间戳2.733 s发送了31诊断请求后,服务器在50ms 内也就是在2.788s无法给出积极或者消极响应,于是就给客户端响应了NRC78,告诉客户端你在给我5000ms的时间,但是由于我们的代码是TestWaitForDiagResponse(req_Reset_All_Parameters_Start,3000)
也就是不管短时间长时间我最多只给你3000ms,在这时间有积极或者消极响应(客户端忽略NRC78),就返回值为1,否则为0;即使服务器后面时间给出了响应,我也不会等待了。
将NRC0x78 当成普通的 NRC
我们 使能DiagSetP2Extended(-1)
代码。
write("DiagSetP2Extended(-1):%d",DiagSetP2Extended(-1));
TestReportWriteDiagObject(req_Reset_All_Parameters_Start);
DiagSendRequest(req_Reset_All_Parameters_Start);
TestWaitForDiagRequestSent(req_Reset_All_Parameters_Start, 150);
retVal = TestWaitForDiagResponse(req_Reset_All_Parameters_Start,3000);
write("TestWaitForDiagResponse():%d",retVal);
write("response size:%ld",diagGetRespPrimitiveSize(req_Reset_All_Parameters_Start));
write("DiagSetP2Extended(-1):%d",DiagSetP2Extended(0));
输出结果:
DiagSetP2Extended(-1):0 // 返回值为0 说明设置成功的;
TestWaitForDiagResponse():1 //返回值为 1 ,说明 在3000ms内收到了积极或者消极的响应。
response size :3 //响应的数据长度是3,说明是消极响应,即返回的 7F 31 78
DiagSetP2Extended(0):0