candump(SocketCAN)ID过滤功能让我非常困惑

11

简而言之,我希望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,它出现两次的事实表明这个帧实际上被两个滤波器匹配,这让我更加困惑。有人能解释这是为什么吗,或者向我展示正确的方法吗?


预测到有人会发布这个...... http://www.mailbrowse.com/linux-can/3494.html 不幸的是,这并没有对我帮助太大......所提供的解释相当少。 - Erik Nyquist
2个回答

11

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

例子(由发布者提供):

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

2
重复消息通常发生在使用环回模式时! - marc

2

回复MByD,评论区容纳不下太长了。

好的,这几乎让我明白了。我说几乎是因为我尝试过这样做:

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

考虑使用一个29位掩码来处理第一个ID,因为它是一个29位的ID;同样地,使用一个11位掩码来处理第二个ID。

然而,这种方法并没有按照我的预期工作——我没有结果在手边,也记不得究竟有什么差异了,但确实存在差异。

你建议使用一个32位的掩码——能否解释一下为什么这样可以工作而使用一个设置了29位的掩码则无法工作呢?或者是我完全误解了吗?

(我现在离开系统,明天才能测试并回报)


嗨,32位掩码是一个错误,对此我很抱歉 :) 无论如何,关于过滤本身-你发布的内容不会起作用,我想看看我的建议有什么问题,请更新。同时,请下次也向我发表评论,这样我就会收到通知。 - MByD
嗯,我不知道这是否是一个问题——你的建议很有可能有效。等一下,让我在我的Linux系统上设置vcan,一旦测试完毕,我会回复你的。 - Erik Nyquist
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:~$ - Erik Nyquist
抱歉...我会看看如何在评论中显示代码示例。无论如何,这只是展示了使用00200200:1fffffff,255:755可以按预期工作。如果您更改答案以使用29位掩码,则我将标记为已回答。感谢您的帮助! - Erik Nyquist
也许是因为我第一次尝试时,输入错误导致00200200:1fffffff,255:7ff无法正常工作。可能是我多打了一个"f"或者少打了两个"f"。 - Erik Nyquist
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接