接收诊断响应的相关CAPL函数,具有较高的可复用性
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接收诊断响应的相关CAPL函数,具有较高的可复用性相关的知识,希望对你有一定的参考价值。
- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📘前言
- 🍅 CAPL诊断相关函数的再封装(发送相关),具有较高的可复用性中集中学习了诊断发送相关的函数,本节就学习下接收相关CAPL函数
- 🍅 演示软硬件环境
Windows11 x64
;CANoe 11 SP2 x64
,Python 3.8 x64
目录
📙 诊接收送相关函数
- 为了和诊断发送函数一致性,减少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);
- 测试结果
🌎总结
- 🍅 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- 🍅 资料网盘路径:
CANoe学习资料›CANoe学习资料›CANoe演示工程代码›CAPL Scripts>诊断函数
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
以上是关于接收诊断响应的相关CAPL函数,具有较高的可复用性的主要内容,如果未能解决你的问题,请参考以下文章