【问题标题】:Heavily confused by candump (SocketCAN) ID filtering feature被 candump (SocketCAN) ID 过滤功能搞糊涂了
【发布时间】:2015-12-28 12:32:32
【问题描述】:

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

【问题讨论】:

标签: linux can-bus socketcan canutils


【解决方案1】:

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

【讨论】:

  • 使用环回模式时通常会出现重复消息!
【解决方案2】:

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

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

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

第一个 ID 使用 29 位掩码的想法,因为它是 29 位 ID,第二个 ID 也是 11 位掩码。

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

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

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

【讨论】:

  • 嗨,32 位掩码是一个错误,抱歉:) 无论如何,重新过滤本身 - 你发布的内容不起作用,我想看看有什么问题我的建议,请更新。另外,下次也请给我评论,我会收到通知的。
  • 好吧,我不知道这是否有问题 - 你的建议可能会奏效。等一下,让我在我的 linux 机器上设置 vcan,我会在测试后回复你。
  • enyquist:~$ candump vcan0,00200200:1fffffff,255:7ff &amp; [1] 7339 enyquist:~$ cansend vcan0 002001fe#1122 enyquist:~$ cansend vcan0 002001ff#1122 enyquist:~$ cansend vcan0 00200200#1122 vcan0 01 2yquist [:2 01 2yquist] ~$ 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 2 2] 11 22 enyquist:~$ cansend vcan0 256#1122 enyquist:~$ cansend vcan0 257#1122 enyquist:~$
  • 对不起...我会看看我是否能弄清楚如何在评论中显示代码示例。无论如何,这只是表明它使用 00200200:1fffffff,255:755 确实可以按预期工作。如果您更改答案以使用 29 位掩码,那么我将标记为已回答。感谢您的帮助!
  • 很高兴听到 :) 在你之前的评论之后我改变了我的答案。并且不需要重新发布日志,已经自己解析了:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2022-01-23
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多