如何在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
相关产品推荐
相关产品推荐

