Как проверить состояние шины в socketcan - PullRequest
0 голосов
/ 20 декабря 2018

Я использую драйвер flexcan для встроенного Linux, и у меня есть C программа, управляющая сообщениями банок.В моей программе C мне нужно проверить состояние шины can, например, buss-off или error-active.Я могу использовать команду linux, например ip -details -statistics link show can0, со следующим результатом:

2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10 link/can promiscuity 0 can state *ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100 bitrate 250000 sample-point 0.866 tq 266 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 30000000 re-started bus-errors arbit-lost error-warn error-pass bus-off 31594 0 0 7686 25577 33258<br> RX: bytes packets errors dropped overrun mcast<br> 5784560 723230 0 1 0 0<br> TX: bytes packets errors dropped carrier collsns 157896 19742 0 33269 0 0

Как я могу получить can state ERROR-ACTIVE в моей программе на C?Также я вижу, что в драйвере гибкой банки 1015 * есть некоторые регистры, которые можно использовать для просмотра состояния, но я не знаю, как включить эти значения в мою программу.регистры типа FLEXCAN_ESR_BOFF_INT содержат значения, которые мне нужны.

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете настроить свой сокет так, чтобы он отображал сообщения об ошибках CAN.

Как описано в Уведомлениях о проблемах сети, драйвер интерфейса CAN может генерировать так называемые кадры сообщений об ошибках, которые при желании могут быть переданы пользовательскому приложению так же, как и другие кадры CAN.Возможные ошибки делятся на различные классы ошибок, которые могут быть отфильтрованы с использованием соответствующей маски ошибок.Для регистрации каждого возможного состояния ошибки CAN_ERR_MASK может использоваться как значение для маски ошибки.Значения для маски ошибок определены в linux / can / error.h

can_err_mask_t err_mask = ( CAN_ERR_TX_TIMEOUT | CAN_ERR_BUSOFF );

setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,
           &err_mask, sizeof(err_mask));

См. Ядро документация для получения дополнительной информации.

Обновление

Взгляните на libsocketcan и процедуру can_get_state .

...