在上一篇文章中(vTESTstudio系列12--vTESTstudio中的动态函数库介绍2),给大家介绍了如何通过osek_tp.dll的接口去发送诊断指令,本篇文章给大家介绍如何去处理诊断回复内容,确保实际的诊断回复是符合需求。Let's Go!!!
目录
1. CanTp接收数据的函数:
1.1 CanTp_ReceptionInd函数的介绍:
1.2 TestSupplyTextEvent函数的介绍:
1.3 TestWaitForTextEvent函数的介绍:
2.自定义CanTp的接收函数:
2.1 更新CanTp_ReceptionInd函数:
2.2 诊断回复函数:
2.3 编辑测试用例并执行测试:
2.4 有趣之处:
1. CanTp接收数据的函数:
1.1 CanTp_ReceptionInd函数的介绍:
CanTp_ReceptionInd这个函数的功能是通过建立CANTP连接的handle,当收到这个连接的数据时,这个函数就会被自动执行,同时将收到的数据存到data这个数组里面。
使用时我们可以直接使用上述图片的案例放到我们的编辑脚本中:
void CanTp_ReceptionInd( long connHandle, byte data[])
{
write( "Received %d byte on connection %d: [%02x] ..."
, elcount( data), connHandle, data[0]);
}
1.2 TestSupplyTextEvent函数的介绍:
TestSupplyTextEvent函数的功能发出指定事件的信号,如上述案例中的错误帧事件信号("ErrorFrame occurred!"),这个文本文档是可以自己定义的。
1.3 TestWaitForTextEvent函数的介绍:
TestWaitForTextEvent函数的功能等待来自单个测试模块的指定文本事件的信号。同时,来自另一个测试模块的信号不会影响此等待指令。如果此事件未在aTimeout时间到期之前发生,则等待条件仍将得到解决,这个时候,该函数的返回值不等于1!!!
2.自定义CanTp的接收函数:
2.1 更新CanTp_ReceptionInd函数:
上述的代码可以看出,接收的诊断数据都放在了data的缓存区数组中,不利于我们做诊断回复的处理,我们在上篇文章的第2章节定义了许多变量,其中就有一个接收数据的数组byte ResponseData[8194];同时我们还要再定义一个golbal变量
ResponseLength:
variables
{
byte crc_temp;
byte crc_value;
//for Diagnostic test parameter
long handle_xml;
int g_rxId = 0x691;
int g_txId_PhysicalAddr = 0x791;
int g_txId_FunctionalAddr = 0x7FF;
byte RequestData[8194];
byte ResponseData[8194];
long ResponseLength = 0;
}
然后我们再对上述的
CanTp_ReceptionInd函数做一些处理:
void CanTp_ReceptionInd(long connHandle, byte data[])
{
int i = 0;
for(i = 0; i<elcount(data); i++)
{
ResponseData[i] = data[i];
}
ResponseLength = elcount(data);
TestSupplyTextEvent("TpMsgReceived");
}
2.2 诊断回复函数:
做完上述的预处理之后,我们开始编辑我们自定义的诊断回复函数:
export testfunction ReceiveDiagResponse()
{
byte ExpectedResponse[8194] = {0x50,0x01,0x00,0x32,0x01,0xF4};
long i =0;
long result;
result = TestWaitForTextEvent("TpMsgReceived", 5000);
if(result ==1)
{
for (i = 0; i <= ResponseLength; i++)
{
if (ResponseData[i] == ExpectedResponse[i])
{
testStepPass("INFO","Diagnostic Response Data[%d] 0x%2x is equal to Expected Respsonse[%d] 0x%2x",i,ResponseData[i],i,ExpectedResponse[i]);
}
else
{
testStepFail("INFO","Diagnostic Response Data[%d] 0x%2x is not equal to Expected Respsonse[%d] 0x%2x Please Check!!!",i,ResponseData[i],i,ExpectedResponse[i]);
}
}
}
}
上述代码中,我们在2.1中的CanTp_ReceptionInd接收完诊断回复后,向Test Module发送“TpMsgReceived”的文本,然后在自定义的诊断回复函数中去check这个“TpMsgReceived”的文本,当TestWaitForTextEvent的返回值为1时,表明所有的诊断回复数据都被接收到,这个时候我们开始处理这个诊断回复,将它与我们的期望结果一个byte一个byte的去比较,一致就pass,不一致就fail。
2.3 编辑测试用例并执行测试:
测试结果如下所示:
我们可以发现每个byte的数据都是对比一致的,我们再更改一个byte数据使得测试不通过:
可以发现Byte[4]的数据不一致,报告中也是红色的fail。
2.4 有趣之处:
当我把上述代码中的TestSupplyTextEvent和TestWaitForTextEvent两个函数注释掉,然后去重新执行测试脚本,报告如下:
有兴趣的朋友可以评论一下为什么会报错。