多包协议中的信号如何单拎出来?CAN通讯

多包协议中的信号如何单拎出来?#CAN通讯#
下图是一个多包的报文,在完成长包请求连接成功后,以下报文分两帧发送:
1CEB56F4 01 9A 0F 3C 0F 45 01 14 (第一包)
1CEB56F4 02 5A 00 ff ff ff ff f~f (第二包)
现在遇到的问题是,导出第8位的信号数据时,总是包含第一包0X14和第二包0Xff两个字节的数据,我只需要第一帧中的第八位。
两帧报文的ID是相同的,DBC中signal要怎么编写才能把第一包0X14和第二包0Xff区分开来?
下图是关于这个信号的DBC设置

img

img

img

在这个问题中,可以考虑使用Multiplexer Switch Value将第一帧和第二帧进行区分。具体步骤如下:

1、在信号定义的行添加 Multiplexer-Switch-Value 属性。这个属性的值应该等于第一帧的信号值。
例如,假设第一帧的信号值是0x14,那么可以这样定义信号:

SG_ MySignal : 7|1@1+ (1,0) [0|100] "My Signal"  Multiplexer-Switch-Value 0x14;

2、对于第二帧,使用 Multiplexer-Switch-Value 属性指定第一帧的信号值外加 1。这样就能够区分第一帧和第二帧了。
例如,假设第一帧的信号值是0x14,那么可以这样定义信号:

SG_ MySignal : 7|1@1+ (1,0) [0|100] "My Signal"  Multiplexer-Switch-Value 0x15;



这样定义后,在解析报文时,根据信号的Multiplexer Switch Value值来判断是第一帧还是第二帧。然后再取出对应的信号位即可。