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

C2X IL CAPL函数中EU_ApplMsg::DENM协议未找到错误求助

错误46-0106:C2xGetTokenInt中找不到"EU_ApplMsg::DENM"协议的解决方法

错误含义

这个错误的核心是CAPL运行环境无法解析你指定的DENM协议:错误提示明确指出需要EU_ApplMsg::DENM,但你的代码里只使用了DENM作为协议名称,或者工程中根本没加载对应的ETSI ITS协议包。这是协议配置/参数匹配问题,和你怀疑的无限循环无关。

解决步骤

  • 确认ETSI ITS协议包已加载
    在CANoe/CANalyzer工程中,检查C2X配置里是否添加了EU_ApplMsg模块:
    1. 打开工程的Configuration -> C2X设置界面
    2. 确保EU_ApplMsg已被添加,且DENM协议处于启用状态
  • 修正C2xGetTokenInt的协议参数
    代码中调用C2xGetTokenInt时,必须使用完整的协议名称EU_ApplMsg::DENM,而不是简写的DENM。修改后的代码如下:
    void OnC2xPacket( long channel, long dir, long radioChannel, long signalStrength, long signalQuality, long packet )
    {
      byte  aRx_stationID;
      // 修正协议名称为完整命名空间
      aRx_stationID = C2xGetTokenInt(packet, "EU_ApplMsg::DENM", "header.stationID");
      
    
      if(aRx_stationID == 222)
      {
        // 同样修正此处的协议名称
        @Veh1::sVarRxDenmCounter = C2xGetTokenInt(packet, "EU_ApplMsg::DENM", "denm.situation.eventType.causeCode");
        if(@Veh1::sVarRxDenmCounter != gRxPacketCounterNew && gRxPacketCounterInit != 1) 
        {
          @Veh1::sVarLostPacketNumber++;
          @Veh1::sVarRecieveDataAge = 0;   
        }
        else
        {
          @Veh1::sVarRecieveDataAge =1;
        }
        gRxPacketCounterNew = ((@Veh1::sVarRxDenmCounter+1)%256);
        gRxPacketCounterInit = 0;
        if(@Veh1::sVarLostPacketNumber > 1000)
        {
          @Veh1::sVarLostPacketNumber =0;
        }    
      }
    }
    
  • 验证信号路径正确性
    如果修改后仍报错,去工程的数据库或C2X协议栈中,确认header.stationID和denm.situation.eventType.causeCode确实属于EU_ApplMsg::DENM的信号层级,避免路径写错。

关于无限循环的说明

你提供的OnC2xPacket函数里没有明显的无限循环逻辑(无死循环的while/for,也没有递归调用)。如果后续运行仍有异常,可以检查全局变量gRxPacketCounterInit、gRxPacketCounterNew的初始化和修改逻辑是否存在异常。

内容的提问来源于stack exchange,提问作者Dani Nasser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:41:06