系列文章目录
车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件
车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控
车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文
车载网络测试实操源码_使用CAPL脚本实现安全访问解锁
车载网络测试实操源码_使用CAPL脚本进行DTC自动化测试
车载网络测试实操源码_使用CAPL脚本进行UDS刷写及其自动化测试
车载网络测试实操源码_使用CAPL脚本进行UDS协议测试
粉丝问题解答系列文章… …
其他持续更新中… …
文章目录
- 系列文章目录
- 前言
- 一、CAPL简介
- 二、CAPL脚本示例
- 总结
前言
在车载软件开发和测试过程中,我们经常会需要模拟发生CAN报文,特别是有些CAN报文按照协议要求是包含Counter和校验码(比如CRC、checksum等)的,这个时候如果使用普通的CAN工具发送固定不变的CAN报文,则不会被认为是有效的CAN报文。如何按照协议模拟counter递增且校验码正确的报文呢?今天我们就来讲一下如何使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文。
一、CAPL简介
CAPL(Communication Access Programming Language)是一种基于C语言开发的编程语言,专门用于CANalyzer和CANoe工具环境。CAPL语言的主要特点包括:
语法结构:CAPL具有类C语言的语法结构,支持多种数据类型,如变量、常量、函数、结构和数组。但CAPL简化了C语言,移除了复杂的指针概念和一些不常用的关键字,同时融入了一些C++的概念,如函数重载等。
特性:CAPL语言支持在对象和图像之间使用可编程语言,可以在PC上进行测试,支持脚本语言,使用可复用的模块,实时诊断和控制,以及丰富的图形和可视化效果等。这些特性使得CAPL在系统开发中更加容易、高效、可靠和安全。
编译过程:CAPL的编译过程简洁高效,因为CAPL浏览器仅对单个文件进行编译,无需进行复杂的链接操作。与C语言编程相比,CAPL的开发过程更为直接和易于上手。在编译阶段,任何语法或语义的错误都会被检测出来,并在CANalyzer和CANoe的专用“write窗口”中报告运行时错误,从而提高了调试的效率。
应用领域:CAPL特别适用于制动系统、压缩机、气体机械和其他复杂的实时控制系统应用程序。同时,由于CAPL语言的简洁和高效,它也被广泛应用于各种测试和分析任务中。
脚本执行:CAPL脚本是基于事件驱动的,没有main函数和程序入口。任何时间都有可能触发CAPL脚本的执行,如按键事件、定时器事件、执行测试等。如果没有事件发生,那么CAPL程序是“闲置的”。
二、CAPL脚本示例
模拟发送符合协议要求(Counter和CRC)的CAN报文的CAPL脚本示例如下:
/*@!Encoding:936*/
includes
{
}
variables
{
//示例CAN报文
message can1.0x123 msg_can1_123 = {
dlc = 8,BRS = 0,
byte(0) = 0xAA,byte(1) = 0xBB,byte(2) = 0x12,byte(3) = 0x34,
byte(4) = 0x56,byte(5) = 0x78,byte(6) = 0x00,byte(7) = 0x00
};
/*定时器*/
msTimer timer_10ms;
}
/*CRC8 校验算法*/
byte crc_sae_j1850_zero(byte dataArry[] ,int length)
{
byte crc;
byte poly;
int i = 0;
int j = 0;
crc = 0x00;
poly = 0x1D;//可根据算法需要修改多项式
for(i =0 ; i < length; i++)
{
crc = crc ^ dataArry[i];
for(j =0 ; j < 8; j++)
{
if ((crc & 0x80) != 0)
{
crc = (crc << 1) ^ poly;
}
else
{
crc = (crc << 1);
}
}
crc &= 0xFF;
}
crc = crc ^ 0x00;
return crc;
}
/*CRC8 校验预处理*/
byte CRCChecksum_calc(message * msg,byte crc_byte_idx,byte len)
{
byte dataArray[64] ;
byte crc;
byte i;
msg.byte(crc_byte_idx) = 0;//初始化CRC为0
for(i = 0; i < len; i++)
{
dataArray[i] = msg.byte(len-1-i);//颠倒字节序(按需)
}
crc = crc_sae_j1850_zero(dataArray,len);
return crc;
}
/*填充发送counter递增、CRC正确的CAN报文*/
void sendValidMsg_InTimer(message * msg,byte counter_byte_idx,byte counter_add,byte crc_byte_idx)
{
msg.Dlc = 8;
msg.BRS = 0;
msg.byte(counter_byte_idx) += counter_add;
msg.byte(crc_byte_idx) = CRCChecksum_calc(msg,crc_byte_idx,8);
output(msg);
}
/*10ms周期定时器*/
on timer timer_10ms
{
sendValidMsg_InTimer(msg_can1_123,6,0x10,7);//byte6为counter,每次递增0x10;byte7为CRC
setTimer(timer_10ms,10);
}
/*启动发送示例*/
on key 'a'
{
setTimer(timer_10ms,0);
}
/*停止发送示例*/
on key 'b'
{
cancelTimer(timer_10ms);
}
以上是模拟发送符合协议要求(Counter和CRC)的CAN报文的CAPL脚本示例,可根据需要修改CRC校验算法,或者改为checksum校验和算法等。按下按键’a’后启动发送CAN报文,按下按键’b’后停止发送CAN报文,效果如下:
总结
本文简单介绍了如何使用CANoe+CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文,希望对大家有所帮助。各位可根据本文的示例,结合自己的需求,进行完善和二次开发。