7

简而言之,我希望 candump 只显示 ID 为 0x00200200 或 0x255 的帧。

所以我这样做:

candump can0,00200200:0,255:0

但这给出了所有帧,并且每帧显示两次。即输出:

cansend can0 256#112233

会是这样的:

can0      256  [3] 11 22 33
can0      256  [3] 11 22 33

除了过滤器的行为不像我预期的那样并通过 0x256 之外,它出现两次的事实表明这个帧实际上是由两个过滤器匹配的,这对我来说更没有意义。谁能解释为什么会发生这种情况,也许可以告诉我正确的方法?

4

2 回答 2

7

在candump的帮助下:

<can_id>:<can_mask> (matches when <received_can_id> & mask == can_id & mask)

现在,当掩码为 0 时,每个 CAN ID 都会匹配它。所以can_id没有实际作用,这就是为什么所有消息都通过,can id中每个需要的位都应该在掩码中设置为1。

关于重复问题,可能是因为您使用了两个过滤器,尽管我对此不确定。

你想做的是:

candump can0,00200200:1fffffff,255:7ff

示例(由 OP 提供):

enyquist:~$ candump vcan0,00200200:1fffffff,255:7ff &
[1] 7339 
enyquist:~$ cansend vcan0 002001fe#1122 
enyquist:~$ cansend vcan0 002001ff#1122 
enyquist:~$ cansend vcan0 00200200#1122
vcan0 00200200 [2] 11 22 
enyquist:~$ cansend vcan0 00200201#1122 
enyquist:~$ cansend vcan0 00200202#1122 
enyquist:~$ 
enyquist:~$ cansend vcan0 253#1122 
enyquist:~$ cansend vcan0 254#1122 
enyquist:~$ cansend vcan0 255#1122
vcan0 255 [2] 11 22 
enyquist:~$ cansend vcan0 256#1122 
enyquist:~$ cansend vcan0 257#1122 
enyquist:~$
于 2015-09-30T16:54:54.817 回答
1

(对 MByD 的回应,太长了,无法放入评论)

好吧,这对我来说几乎是有道理的。我说差不多的原因是因为我试过这个:

candump can0,00200200:1fffffff,255:7ff

考虑到对第一个 ID 使用 29 位掩码,因为它是一个 29 位 ID,对于第二个 ID 同样是一个 11 位掩码。

然而,这也没有像我预期的那样工作——我面前没有输出,我不记得到底有什么差异,但有一个。

您建议使用 32 位掩码 - 您能解释为什么这会起作用,但使用设置为 29 位的掩码不起作用吗?还是我完全误解了它?

(我现在离开我的系统,我明天可以测试它,然后再报告)

于 2015-09-30T17:55:46.563 回答