我正在做一个项目,将通过CAN总线连接多个子系统(传感器,控制器等)。我使用SocketCAN,设置如下:
root@ngtianxun-desktop:~# ip -details -statistic link show can0
5: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can promiscuity 0 minmtu 0 maxmtu 0
can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 10
bitrate 500000 sample-point 0.600
tq 100 prop-seg 3 phase-seg1 8 phase-seg2 8 sjw 4
RDC_CAN: tseg1 5..16 tseg2 3..8 sjw 1..4 brp 2..131072 brp-inc 2
clock 20000000
re-started bus-errors arbit-lost error-warn error-pass bus-off
0 0 337 0 0 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
RX: bytes packets errors dropped overrun mcast
27841616 3498429 0 0 0 0
TX: bytes packets errors dropped carrier collsns
9504120 2357958 0 0 0 0
root@ngtianxun-desktop:~#
已经编写了Python脚本来持续监控子系统,并根据Python端请求向子系统写入。
我的问题是-为什么我看到仲裁丢失每次以大约5分钟的间隔增加1,一旦我的python程序运行?这表明有什么严重的问题吗?这是否意味着数据帧丢失了?如果我就这样放任不管,你会担心吗?任何人谁可以帮助回答和解释将不胜感激!
值得注意的是:程序开始约3天。只观察到仲裁丢失,没有重新启动、总线错误、错误警告、错误传递和总线关闭。并且在TX/RX字段中没有error、dropped、overrun、mcast、carrier和collsns错误。
通常您可以安全地忽略仲裁丢失的错误。这只是意味着一条信息在仲裁中败给了另一条信息。值得庆幸的是,CAN已经变得足够强大,以至于"仲裁败诉者";将再次发送。
我推荐以下阅读:
维基百科- SocketCAN