3. 接收并解析CAN消息

任务目标

编写CAPL程序,在CANalyzer中接收ID为0x456的CAN消息,解析其8个数据字节,并将解析结果打印到输出窗口(Write窗口)。

实现思路

通过CAPL的on message事件处理器捕获指定ID的消息。在事件处理函数中,使用this.byte()方法逐字节读取数据,并通过write()函数输出解析结果。该程序无需额外依赖,直接在CANalyzer的CAPL Browser中编写并关联到Measurement Setup即可运行。

完整代码

<code>/*@!Encoding:1252*/
variables
{
  // 可在此定义全局变量(本例无需)
}

// 接收ID = 0x456的消息
on message 0x456
{
  int i;
  char msgInfo[256];
  char byteStr[16];

  // 组装消息基本信息
  snprintf(msgInfo, elcount(msgInfo), "收到消息 ID=0x%03X DLC=%d", this.id, this.dlc);
  write("%s", msgInfo);

  // 逐字节解析并打印数据
  for (i = 0; i < this.dlc; i++)
  {
    snprintf(byteStr, elcount(byteStr), "  Byte[%d] = 0x%02X", i, this.byte(i));
    write("%s", byteStr);
  }

  // 若DLC小于8,补充提示
  if (this.dlc < 8)
  {
    write("  注意:DLC=%d,不足8字节", this.dlc);
  }
}

运行步骤

  1. 打开CANalyzer,创建或打开一个工程。
  2. 在Measurement Setup中插入一个CAPL Program节点,双击打开CAPL Browser。
  3. 将上述代码粘贴到CAPL Browser中,点击Compile按钮(或按F5)编译,确保无错误。
  4. 关闭CAPL Browser,激活CAPL Program节点(勾选或点击Online)。
  5. 启动Measurement(按F9或点击Start按钮)。
  6. 使用IG(Interaction Generator)或CANoe/CANalyzer的发送功能,向总线发送一条ID=0x456、DLC=8的消息,例如数据为 01 02 03 04 05 06 07 08。

验证方法

观察Write窗口(输出窗口),应看到类似以下输出:

收到消息 ID=0x456 DLC=8
  Byte[0] = 0x01
  Byte[1] = 0x02
  Byte[2] = 0x03
  Byte[3] = 0x04
  Byte[4] = 0x05
  Byte[5] = 0x06
  Byte[6] = 0x07
  Byte[7] = 0x08

若发送的DLC小于8(例如只发送3个字节),程序会额外打印提示信息。输出内容与发送数据一致,即表示接收与解析功能正常。

常见问题

  • 编译错误:确认代码中无中文字符(注释除外),且elcount函数在CANalyzer 8.0以上版本可用。
  • 收不到消息:检查总线仿真是否开启、CAPL节点是否激活、消息ID是否为扩展帧(0x456为标准帧ID,若发送扩展帧需用on message 0x18x456语法)。
  • 输出乱码:Write窗口默认支持ASCII,若需显示中文请调整编码设置。