Сильно смущен функцией фильтрации идентификаторов Candump (SocketCAN)
Короче говоря, я хочу, чтобы Candump показывал мне ТОЛЬКО кадры с идентификаторами 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 ответа
С помощью Candump:
<can_id>:<can_mask> (matches when <received_can_id> & mask == can_id & mask)
Теперь, когда маска равна 0, каждый CAN ID будет соответствовать ей. Таким образом, can_id не имеет никакого реального эффекта, поэтому все сообщения проходят, каждый требуемый бит в идентификаторе can должен быть установлен в 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:~$
(Ответ на MByD, слишком длинный, чтобы поместиться в комментарии)
ОК, это почти имеет смысл для меня. Причина, по которой я говорю почти, в том, что я попробовал это:
candump can0,00200200:1fffffff,255:7ff
Идея использования 29-битной маски для первого идентификатора, поскольку это 29-битный идентификатор, а также 11-битная маска для второго идентификатора.
Тем не менее, это не сработало так, как я ожидал - у меня нет вывода перед собой, и я не могу вспомнить, что именно было несоответствие, но оно было.
Вы предлагаете использовать 32-битную маску - можете ли вы объяснить, почему это будет работать, но использование маски с установленным 29-битным не сработало? Или я просто совершенно не понимаю?
(Я пока не в своей системе, завтра смогу проверить и сообщу тогда)