Сильно смущен функцией фильтрации идентификаторов 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-битным не сработало? Или я просто совершенно не понимаю?

(Я пока не в своей системе, завтра смогу проверить и сообщу тогда)

Другие вопросы по тегам