被 candump (SocketCAN) ID 过滤功能严重混淆

Heavily confused by candump (SocketCAN) ID filtering feature

简而言之,我希望 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,它出现两次的事实表明这个帧实际上与两个过滤器匹配,这对我来说更没有意义。任何人都可以解释为什么会发生这种情况,并告诉我正确的方法吗?

来自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:~$

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

好的,几乎对我来说很有意义。我说几乎是因为我试过这个:

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

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

但是,这也没有按我预期的方式工作 - 我面前没有输出,我不记得到底有什么差异,但有一个。

您建议使用 32 位掩码 - 您能解释一下为什么这样做可行但使用 29 位设置的掩码不起作用吗?还是我完全误解了?

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