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模块:- 打开工程的
Configuration->C2X设置界面 - 确保
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
相关产品推荐
相关产品推荐

