CANoe的CAPL编程基础(2)

1、检查错误帧
进行CAN通讯的测试时,检查错误帧是很常见的,要用CAPL脚本实现自动检测错误帧也不困难,它的核心就是调用错误检查函数ChkStart_ErrorFrameOccured();该函数一旦被调用,CANoe就会从此函数被调用时开始持续检测总线上有没有出现错误帧。
下面是一个小的例子:

dword chechId;
dword numCheckEvents;
checkId=ChkStart_ErrorFrameOccured();//开始检测错误帧
TestAddCondition(checkId);//添加检测条件,如果出现了错误帧,则输出报告中会记录下来
TestWaitForTimeout(5000);//持续检测5s
checkControl_Stop(checkId);//停止检测错误帧
numCheckEvents=ChkQuery_NumEvents(checkId);//对5s内的检测情况进行获取,若函数返回0则没有出现错误帧
if(numCheckEvents>0)
     TestStepFail("Error Frames Occured");

2、添加事件信号
这种事件信号相当于uC-OS中的信号量机制,一般使用在需要等待某个或者是多个条件满足时进行下一步操作的地方。具体做法是:在一个位置添加需要等待的事件,程序中的其他地方,如果某个事件发生了(如周期超界等),提供该事件的供应,则等待的程序段获得了该事件,继续执行下面的操作。主要使用的函数有以下几个:

//供应text事件
long TestSupplyTextEvent( char aText[] );
//添加text事件
long TestJoinTextEvent(char[]aText);
//等待text事件,有一个出现则程序执行下一步
long TestWaitForAnyJoinedEvent(dword aTimeout);
//等待text事件,所有等待事件都出现则程序执行下一步
long TestWaitForAllJoinedEvents(dword aTimeout);

以下是一个例子:

TestJoinTextEvent("Test finished");
TestJoinTextEvent("Error Frame Occured");
TestWaitForAnyJoinedEvents(20000);
或者:
TestWaitForAllJoinedEvents(20000);

在系统事件on errorFrame中:
on errorFrame
{
   TestSupplyTextEvent("Error Frame occured");
}
在系统的on message 中:
on message 0x400
{
   TestSupplyTextEvent("Test Finished")
}

3、回调函数
CAPL中也有类似于C语言中的回调函数的机制,如检测报文周期和错误帧的函数中就可以使用,当周期超界或者总线出现错误帧就会自动调用回调函数执行一些操作;
如:

ErrChkId=ChkStart_ErrorFramesOccured("Callback_ErrorFrameOccured");//检查错误帧,如果发现错误帧就调用回调函数

回调函数设计如下:
void Callback_errorFrameOccured(dword chk_id)
{
  float t;
  t=timeNow()/100000.0;//记录出现错误帧的时间
  testStep("ErrorFrameTimeStamp","%.6f s",t);//打印该事件戳
  TestSupplyTextEvent("ErrorFrameOccured");//供应Text事件
}

猜你喜欢

转载自blog.csdn.net/shuoyueqishilove/article/details/78266828
今日推荐