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

时间:2015-09-30 16:09:39

标签: linux can-bus socketcan canutils

简而言之,我希望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之外,它显示两次的事实表明这些帧实际上是由两个滤波器匹配的,这对我来说更没意义。任何人都可以解释为什么会这样,也许可以告诉我正确的方法吗?

2 个答案:

答案 0 :(得分:5)

candump的帮助下:

library(plyr)
library(dplyr)
library(zoo)

df %>%
  mutate(date = Sort.In.Date %>% as.Date,
         day_of_week = date %>% format("%w") %>% as.numeric) %>%
  full_join(data_frame(date = as.Date("6/1/2015"):as.Date("8/31/2015") %>% as.Date) ) %>%
  mutate(OrderedQty.expand = OrderedQty %>% mapvalues(NA, 0) )  %>%
  filter(date %>% between(as.Date("6/1/2015"), as.Date("8/31/2015") ) &
         day_of_week %>% between(1, 5) ) %>%
  group_by(Location.Name, Item.Description) %>%
  arrange(date) %>%
  summarize(OrderedQty.mean = mean(OrderedQty.expand),
            OrderedQty.sd = sd(OrderedQty.expand),
            average_interval = date %>% diff %>% mean)

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

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

您想要做的是:

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

示例(由OP提供):

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

答案 1 :(得分:1)

(对MByD的回应,太久不适合评论)

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

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

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

然而,这并没有像我预期的那样工作 - 我没有在我面前输出,我不记得究竟是什么差异,但有一个。

您建议使用32位掩码 - 您能解释为什么会起作用但是使用29位掩码不起作用吗?或者我只是完全误解了它?

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