如何检查socketcan中的总线状态

时间:2018-12-20 14:22:38

标签: embedded-linux can-bus socketcan

我在嵌入式Linux上使用flexcan driver,并且有C个程序可以控制can消息。在我的C程序中,我需要检查can bus的状态,例如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

如何在我的C程序中获得该can state ERROR-ACTIVE?我也可以在flex can driver中看到一些寄存器,可以用来查看状态,但是我也不知道如何在程序中包含这些值。像FLEXCAN_ESR_BOFF_INT这样的寄存器包含我需要的值。

1 个答案:

答案 0 :(得分:1)

您可以设置套接字以将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));

有关更多信息,请参见内核documentation

更新

看看libsocketcan和例程can_get_state