车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文

系列文章目录

车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件
车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控
车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文
车载网络测试实操源码_使用CAPL脚本实现安全访问解锁
车载网络测试实操源码_使用CAPL脚本进行DTC自动化测试
车载网络测试实操源码_使用CAPL脚本进行UDS刷写及其自动化测试
车载网络测试实操源码_使用CAPL脚本进行UDS协议测试
粉丝问题解答系列文章… …
其他持续更新中… …



前言

在车载软件开发和测试过程中,我们经常会需要模拟发生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报文,希望对大家有所帮助。各位可根据本文的示例,结合自己的需求,进行完善和二次开发。

  • 26
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrxMyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值