如何检查socketcan中的总线状态

PHA*_*PHA 5 can-bus embedded-linux socketcan

我在嵌入式 Linux 上使用Flexcan 驱动程序,并且有C程序控制 CAN 消息。在我的C程序中,我需要检查 can 总线的状态,例如buss-offerror-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     
    RX: bytes  packets  errors  dropped overrun mcast   
    5784560    723230   0       1       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    157896     19742    0       33269   0       0       
Run Code Online (Sandbox Code Playgroud)

我怎样才能can state ERROR-ACTIVE在我的 C 程序中得到它?我还可以在Flex Can 驱动程序中看到一些寄存器可用于查看状态,但我不知道如何将这些值包含在我的程序中。寄存器FLEXCAN_ESR_BOFF_INT包含我需要的值。

yeg*_*ich 5

您可以设置套接字以将 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));
Run Code Online (Sandbox Code Playgroud)

请参阅内核文档以获取更多信息。

更新

看一下libsocketcan例程can_get_state