接收诊断响应的相关CAPL函数,具有较高的可复用性

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接收诊断响应的相关CAPL函数,具有较高的可复用性相关的知识,希望对你有一定的参考价值。


📘前言

目录


📙 诊接收送相关函数

  • 为了和诊断发送函数一致性,减少diagResponse变量的接入,只选择了 DiagGetRespxx形式的函数

DiagGetRespPrimitiveSize (获取诊断响应的单个数据)

  • 封装函数名:Diag_SendAndGetResponseData

  • DiagGetRespPrimitiveSize : 根据索引获取诊断返回的数据大小,

  • DiagGetRespPrimitiveByte : 根据索引读取诊断返回数据

// @DiagReq :发送诊断
// @ExpResCode:可以对诊断响应进行判断,可以期望正响应,NRC,或者没响应
// @SendType :可以指定物理请求还是功能请求
// @resData  : 读取数据
// @resSize  :读取返回数据的大小
void Diag_SendAndGetResponseData(diagrequest *DiagReq, long ExpResCode,byte SendType, byte resData[], long & resSize)

  long i;
  Send_DiagRequest_diag(DiagReq,ExpResCode,SendType);
  
  if(TestGetVerdictLastTestCase() == 0)
  
    resSize = DiagGetRespPrimitiveSize(DiagReq);
    if (elCount(resData) >= resSize)
    
    	for(i = 0; i < resSize; i ++)
			
				resData[i] = DiagGetRespPrimitiveByte(DiagReq, i);     
      
      TestStepPass("Response Data getted.");
    
    else
    
       TestStepFail("Parameter resData arrary too small.");
        
  


  • testcase 代码:
testcase TC_004()
 
  const long NoResponse = 0;
  const long PostitiveResponse = -1;
  const long NrcResponse_7E = 0x7E;
  const long phy_diagRequest = 0;
  byte resData[256];
  long  resSize; 
  diagRequest  System_Supplier_ECU_Hardware_Version_Number_Read    ECU_HW_VersionNumber_Read;  
  diagSetTarget(ECU_Name);
  Diag_SendAndGetResponseData(ECU_HW_VersionNumber_Read, PostitiveResponse , phy_diagRequest,resData,resSize);


  • xml 代码:
<testmodule title="诊断函数测试" version="1.1">
	<externalref type="url" title="CSDN蚂蚁小兵">
      https://blog.csdn.net/qq_34414530
   </externalref>
	<testgroup title="TestGroup_1">
		<capltestcase name="TC_001" title="TC_001"/>		
		<capltestcase name="TC_002" title="TC_002"/>
		<capltestcase name="TC_003" title="TC_003"/>
		<capltestcase name="TC_004" title="TC_004"/>
	</testgroup>
</testmodule>

  • 测试报告:


diagGetPrimitiveData (获取诊断返回的所有数据)

  • 封装函数名:Diag_SendAndGetResponseData

  • diagGetPrimitiveData : 获取诊断返回的所有数据,但是没有CAP里没有内置diagGetRespPrimitiveData 这个函数,这就意味着要多定义一个diagResponse 诊断变量,所以在接收诊断函数的时候,一般不用这个,用上面那个函数就行

// @DiagReq :发送诊断
// @ExpResCode:可以对诊断响应进行判断,可以期望正响应,NRC,或者没响应
// @SendType :可以指定物理请求还是功能请求
// @resData  : 读取数据
// @resSize  :读取返回数据的大小
void Diag_SendAndGetResponseData(diagrequest *DiagReq,diagResponse*DiagRes, long ExpResCode,byte SendType, byte resData[], long & resSize)

  long i;
  Send_DiagRequest_diag(DiagReq,ExpResCode,SendType);
  
  if(TestGetVerdictLastTestCase() == 0)
  
    resSize = DiagGetRespPrimitiveSize(DiagReq);
    if (elCount(resData) >= resSize)
    
	  diagGetPrimitiveData  (DiagRes,resData,resSize );
      TestStepPass("Response Data getted.");
    
    else
    
       TestStepFail("Parameter resData arrary too small.");
        
  


DiagGetRespParameter(数值类型)

  • 封装函数名:Diag_SendAndGetParameter_numeric

  • 因为parameter是在cdd/odx诊断数据文件中定义命名的,所以要求cdd/odx做的比较完善

  • 函数help文档参数:double diagGetRespParameter (diagRequest req, char parameterName[]); 返回的是数值


// @DiagReq :发送诊断
// @Parameter  : cdd paramter 字符串
// @resData  : 读取数据
// @resSize  :读取返回数据的大小
long Diag_SendAndGetParameter_numeric(diagrequest *DiagReq, char Parameter[], byte resData[],int64 & resValue)

  long i,resSize;
  resSize = 0;
  
  Send_DiagRequest_diag(DiagReq);
  
  if(TestGetVerdictLastTestCase() == 0)
  
    resSize = DiagGetRespPrimitiveSize(DiagReq);
    if (elCount(resData) >= resSize)
    
      // DiagGetRespParameter 返回值时double 类型,但实际上都是ascii
      // 因为double占8个字节,所以转int64比较合适
      resValue = (int64)DiagGetRespParameter(DiagReq,Parameter);
      write("**resValue**:0x%I64x",resValue);
      TestStepPass("Response Data getted.");
    
    else
    
       TestStepFail("Parameter resData arrary too small.");
        
  
  
  return resSize;


  • testcase 代码:
testcase TC_005()
 
  byte resData[256];
  int64  resValue; 
  diagRequest  DefaultSession_Start  DefaultSession_Start;                  //1001
  diagSetTarget(ECU_Name);
  Diag_SendAndGetParameter_numeric(DefaultSession_Start,"P2",resData,resValue); 



  • xml 代码:
<testmodule title="诊断函数测试" version="1.1">
	<externalref type="url" title="CSDN蚂蚁小兵">
      https://blog.csdn.net/qq_34414530
   </externalref>
	<testgroup title="TestGroup_1">
		<capltestcase name="TC_001" title="TC_001"/>		
		<capltestcase name="TC_002" title="TC_002"/>
		<capltestcase name="TC_003" title="TC_003"/>
		<capltestcase name="TC_004" title="TC_004"/>
		<capltestcase name="TC_005" title="TC_005"/>
	</testgroup>
</testmodule>

  • 测试结果

DiagGetRespParameter(字符串类型)

  • 封装函数名:Diag_SendAndGetParameter_string
  • 函数参数:long diagGetRespParameter (diagRequest req, char parameterName[], char buffer[], dword bufferLen); 返回的是char 数组
// @DiagReq :发送诊断
// @Parameter  : cdd paramter 字符串
// @resData  : 读取数据(字符串形式)
// @resSize  :读取返回数据的大小
long Diag_SendAndGetParameter_string(diagrequest *DiagReq, char Parameter[], char resData[])

  long i,resSize;
  resSize = 0;
  
  Send_DiagRequest_diag(DiagReq);
  
  if(TestGetVerdictLastTestCase() == 0)
  
    resSize = DiagGetRespPrimitiveSize(DiagReq);
    if (elCount(resData) >= resSize)
    
      DiagGetRespParameter(DiagReq,Parameter,resData,resSize);
      write("**resValue**:%s",resData);
      TestStepPass("Response Data getted.");
    
    else
    
       TestStepFail("Parameter resData arrary too small.");
        
    
  return resSize;


  • testcase 代码:
testcase TC_006()
 
  char resData[256];
  int64  resValue; 
  diagRequest  System_Supplier_ECU_Hardware_Version_Number_Read    ECU_HW_VersionNumber_Read; 
  diagSetTarget(ECU_Name);
  Diag_SendAndGetParameter_string(ECU_HW_VersionNumber_Read,"Hardware_Version/DID_F193_VersionNumber",resData); 


  • xml 代码:
<testmodule title="诊断函数测试" version="1.1">
	<externalref type="url" title="CSDN蚂蚁小兵">
      https://blog.csdn.net/qq_34414530
   </externalref>
	<testgroup title="TestGroup_1">
		<capltestcase name="TC_001" title="TC_001"/>		
		<capltestcase name="TC_002" title="TC_002"/>
		<capltestcase name="TC_003" title="TC_003"/>
		<capltestcase name="TC_004" title="TC_004"/>
		<capltestcase name="TC_005" title="TC_005"/>
		<capltestcase name="TC_006" title="TC_006"/>
	</testgroup>
</testmodule>

  • 测试结果


DiagGetRespParameter(byte数组)

  • 封装函数名:Diag_SendAndGetParameter_raw
  • 函数参数:long diagGetRespParameter (diagRequest req, char parameterName[], char buffer[], dword bufferLen); 返回的是char 数组
// @DiagReq :发送诊断
// @Parameter  : cdd paramter 字符串
// @resData  : 读取数据(字节数组形式)
// @resSize  :读取返回数据的大小
long Diag_SendAndGetParameter_raw(diagrequest *DiagReq, char Parameter[], byte resData[])

  long i,resSize;
  resSize = 0;
    
  Send_DiagRequest_diag(DiagReq);
  
  if(TestGetVerdictLastTestCase() == 0)
  
    resSize = DiagGetRespPrimitiveSize(DiagReq);
    if (elCount(resData) >= resSize)
    
      diagGetRespParameterRaw (DiagReq,Parameter,resData,resSize);
      write("**resValue**:0x%x",resData[0]);
      TestStepPass("Response Data getted.");
    
    else
    
       TestStepFail("Parameter resData arrary too small.");
        
    
  return resSize;


  • testcase 代码:
testcase TC_007()
 
  byte resData[256];
  int64  resValue; 
   diagRequest  System_Supplier_ECU_Hardware_Version_Number_Read    ECU_HW_VersionNumber_Read; 
  diagSetTarget(ECU_Name);
  Diag_SendAndGetParameter_raw(ECU_HW_VersionNumber_Read,"Hardware_Version/DID_F193_VersionNumber",resData); 


  • 测试结果


🌎总结

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。

以上是关于接收诊断响应的相关CAPL函数,具有较高的可复用性的主要内容,如果未能解决你的问题,请参考以下文章

接收诊断响应的相关CAPL函数,具有较高的可复用性

封装了几个CAPL发送诊断相关函数,具有较高的可复用性

封装了几个CAPL发送诊断相关函数,具有较高的可复用性

封装了几个CAPL发送诊断相关函数,具有较高的可复用性

软件的可复用性和维护性

软件的可复用性和维护性