You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CANalyzer 8.5 SP7中获取报文的接收方属性?

解决CAPL中获取报文接收节点的问题

在CANalyzer 8.5 SP7中,报文对象this并没有直接提供receiver或receivers属性,但可以通过CAPL的数据库访问函数获取CANdb中定义的报文接收节点列表,以下是两种可行的实现方式:

方法一:通用报文监听(匹配所有报文)

通过dbGetMessage获取当前报文的句柄,再用dbGetMessageReceivers提取接收节点列表,遍历判断是否包含目标节点:

on message *
{
  char receiverList[100];
  long msgHandle = dbGetMessage(this.id);
  if(msgHandle != 0)
  {
    // 获取以逗号分隔的接收节点字符串,返回值为节点数量
    int receiverCount = dbGetMessageReceivers(msgHandle, receiverList, sizeof(receiverList));
    char* currentReceiver = strtok(receiverList, ",");
    
    while(currentReceiver != NULL)
    {
      if(strcmp(currentReceiver, "BCM") == 0)
      {
        write("The message %x will be received by the BCM", this.ID);
        break;
      }
      currentReceiver = strtok(NULL, ",");
    }
  }
}

方法二:指定报文监听(已知报文名称)

如果已经明确要监听的报文(比如"BODY1"),可以直接通过名称获取报文句柄:

on message BODY1
{
  char receiverList[100];
  long msgHandle = dbGetMessageByName("BODY1");
  if(msgHandle != 0)
  {
    int receiverCount = dbGetMessageReceivers(msgHandle, receiverList, sizeof(receiverList));
    char* currentReceiver = strtok(receiverList, ",");
    
    while(currentReceiver != NULL)
    {
      if(strcmp(currentReceiver, "BCM") == 0)
      {
        write("The message BODY1 will be received by the BCM");
        break;
      }
      currentReceiver = strtok(NULL, ",");
    }
  }
}

注意事项

  • 确保CANdb数据库已正确加载到CANalyzer工程中,否则dbGetMessage等函数会返回0;
  • dbGetMessageReceivers返回的接收节点以逗号分隔,需通过strtok函数分割后逐个校验。

内容的提问来源于stack exchange,提问作者Sombra do Baiano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:45:34