CANoe信号处理和CRC计算

问题描述 投票:0回答:2

我有一个 CANoe 环境,在其中使用 DBC 文件模拟一系列节点及其关联的帧。其中一些帧的有效负载具有 8 位 CRC 校验和,我在 CAPL 中使用 Crc_CalculateCRC8 成功计算了这些校验和。

当我手动更改信号值(通过面板、vTESTstudio 脚本等)时,就会出现问题。因为我使用“on signal”事件处理程序来重新计算 CRC,所以它仅在信号已在总线上更新后才会触发。这意味着信号更新后的第一帧出现 CRC 校验和错误,该错误随后在收到下一帧时修复。 有没有办法让我在信号发送到总线之前访问该信号的值(例如存储在交互层堆栈/缓冲区中的值)?

我知道我可以通过创建单独的系统变量并在面板/脚本中修改这些变量来解决这个问题,但这会达不到目的,因为这样我将无法访问信号值表并增加很多额外的复杂性。

我确信一定有一种简单的方法可以使用内置的 CANoe 功能来做到这一点,因为 CRC 是一个常见的功能...

谢谢

can-bus crc capl canoe
2个回答
0
投票

如果您使用 dbc,则只需使用 capl 函数 applILTxPending() 即可。它使您能够在 IL 将数据发送到总线之前更改数据。 (注意:我还没有编译这个,希望没有错误)

dword applILTxPending(long aId, dword aDlc, byte data[])
{
  // if the message 0x060 contains the crc data in 0th byte
  byte crc;
  int i;
  if (aID == 0x60)
  {
    // crc calculation (or use Crc_CalculateCRC8() as you need here)
    crc = 0xFF;
    for (i=1;i<cDlc,++i)
    {
      crc = crc ^ data[i];
    }
    // set the crc 
    data[0] = crc;
  }
  return 1; // this keeps sending the message
}

0
投票

我没有 DBC 文件,但我想知道 CRC 在 Payload 中的位置?

例如:

时间 Chn ID 事件类型 Dir DLC 数据
1.201430 CAN 1 201 CAN 帧接收 8 00 00 00 00 FF 8E 20 A5

5.251788 CAN 1 201 CAN 帧接收 8 00 00 00 00 FF 8B B0 2F

© www.soinside.com 2019 - 2024. All rights reserved.