embedded-linux - 如何检查socketcan中的总线状态
问题描述
我在嵌入式 linux 上使用flexcan 驱动程序C
,并且我有程序控制 can 消息。在我的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
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
我怎样才能can state ERROR-ACTIVE
在我的 C 程序中得到它?我还可以在flex can 驱动程序中看到一些寄存器可用于查看状态,但我也不知道如何在我的程序中包含这些值。像这样的寄存器FLEXCAN_ESR_BOFF_INT
包含我需要的值。
解决方案
您可以设置您的套接字以将 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。
推荐阅读
- python - 类函数不显示传入的值
- python - 如何在 pandas DataFrame 中计算 groupby 均值和方差?
- maven - 运行 liquibase generateChangelog 时超出 GC 开销限制
- regex - Python正则表达式:仅当字符串跟随大括号时才匹配字符串
- android - 在 Kotlin 中使用与 LiveData 值同步会引发关于类型推断的编译错误
- sql - 我想知道这是否正确
- sqlite - sqlite3:“IN”有效,“NOT IN”无效
- processing - 我在处理中遇到了反射调用目标异常,但找不到导致它的原因
- java - java-如何在向表中插入记录时设置回滚功能?
- python - 无法在 Debian (Raspbian) 上安装 psutil