诊断模块在CAPL中还是比较成熟的,而且有大量封装好的系列函数可以帮助我们在平时的测试过程中实现自动化测试。这里我就着重介绍一些我们会进场使用到的函数来完成我们日常的测试场景的覆盖。
- diagResize 函数
具体的格式如下。主要是调整诊断对象的大小以匹配指定的参数迭代,或将总线消息的大小设置为给定的字节数。
用例:
diagRequest PAS3.* pasDiagReqst;
dword diagLen;
diagLen = stringToBytes(diagString, rawDiagReqst);
diagResize(pasDiagReqst, diagLen);
- diagSetPrimitiveByte 函数
具体的格式如下。主要是用于设定诊断对象指定字节的数值。
用例:
for(i=0;i<diagLen;i++)
{
diagSetPrimitiveByte(pasDiagReqst, i, diagData[i]);
}
- diagSetPrimitiveData 函数
具体格式如下:主要是用于设置完整服务原语的原始数据(通过传输协议传输的所有数据)。
用例:
// Print the length and first byte of a diagnostic request object
PrintDiagRequestBytes( diagRequest * req)
{
BYTE primitiveRaw[4095];
long size;
size = DiagGetPrimitiveData( req, primitiveRaw, elcount( primitiveRaw));
if( size > 0)
write( "Request = (%d)[%02x ...]", size, primitiveRaw[0]);
else
write( "Request: error %d", size);
}
注意:我对于diagSetPrimitiveData 函数 与 diagSetPrimitiveByte 函数的区别理解是:前者不要增加循环,函数自带该功能;后者主要时针对于指定字节的设置。
- TestReportWriteDiagObject/TestReportWriteDiagResponse 函数
具体格式如下。主要是用于在测试报告中增加诊断请求或响应的报文打印。
用例:
diagRequest PAS3.* pasDiagReqst;
testReportWriteDiagObject(pasDiagReqst);
- TestWaitForDiagRequestSent 函数
具体的格式如下。主要用于定义在指定时间内将要求的诊断请求发送出去。
用例:
DiagRequest SerialNumber_Read req;
long result;
DiagSetTarget("Door");
req.SendRequest();
// waits until request is completely sent
if (TestWaitForDiagRequestSent(req, 2000)== 1)
TestStepPass("Request was sent successfully!");
else
TestStepFail("Request could not be sent!");
TestWaitForDiagResponse(req, 2000);
- TestWaitForDiagResponse 函数
具体的格式如下。主要用于定义在指定时间内是否收到诊断请求的响应。
用例:
diagResponse PAS3.* pasDiagRespd;
const cApplicationTimeoutMs = 5000;
result = testWaitForDiagResponse(pasDiagReqst, cApplicationTimeoutMs)
- diagGetLastResponse 函数
具体的格式如下。主要用于获取最新的诊断请求响应。
用例:
diagResponse PAS3.* pasDiagRespd;
diagGetLastResponse(pasDiagRespd);
- diagGetPrimitiveData 函数
具体的格式如下。主要用于读取一个诊断服务的原始数据。
用例:
// Print the length and first byte of a diagnostic request object
PrintDiagRequestBytes( diagRequest * req)
{
BYTE primitiveRaw[4095];
long size;
size = DiagGetPrimitiveData( req, primitiveRaw, elcount( primitiveRaw));
if( size > 0)
write( "Request = (%d)[%02x ...]", size, primitiveRaw[0]);
else
write( "Request: error %d", size);
}
- diagGetPrimitiveByte 函数
具体的格式如下。主要用于读取诊断服务中的某一字节的数据。
- diagIsPositiveResponse / diagIsNegativeResponse 函数
具体的格式如下。主要用于判断回复的诊断相应是否为正/负响应,如果是则返回一个不为0的数值。
用例:
on diagResponse *
{
// Handle the ambiguity of neg responses by treating them as '*'
if( diagIsNegativeResponse ( this ) )
{
write( "Received negative response for service 0x%x, code 0x%x",
(long) diagGetParameter( this, "SIDRQ_NR" ),
(long) diagGetParameter( this, "NRC" ) );
}
}