Linux-CAN设备问题记录

Write failed: No buffer space available

  • 向can设备中写入数据时提示如上,问题为can设备的写队列满了
    • 增加写队列大小 ip link set can1 txqueuelen 100
    • 或者找个设备实时接收can设备发送的数据即可

通过ip -details -statistics link show can1或者cat /sys/class/net/can1/tx_queue_len可以看到发送队里长队为10

3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
    link/can  promiscuity 0
    can state ERROR-WARNING (berr-counter tx 128 rx 0) restart-ms 1000
          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
          0          0          0          1          0          0
    RX: bytes  packets  errors  dropped overrun mcast
    8          1        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0

以下是对 ip -details -statistics link show can1 命令输出的解释:

  1. 基础信息

    3: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
    
    • 3: 设备编号
    • can1: 设备名称
    • <NOARP,UP,LOWER_UP,ECHO>: 设备状态标志:
      • NOARP: 不使用地址解析协议(ARP)
      • UP: 设备已启动
      • LOWER_UP: 物理层连接正常
      • ECHO: 启用了回显功能
    • mtu 16: 最大传输单元(MTU)为 16 字节
    • qdisc pfifo_fast: 队列调度器使用 pfifo_fast
    • state UNKNOWN: 当前状态未知
    • mode DEFAULT: 默认模式
    • group default: 设备所属的组
    • qlen 10: 发送队列长度为 10
  2. CAN 设备特性

    link/can  promiscuity 0
    can state ERROR-WARNING (berr-counter tx 128 rx 0) restart-ms 1000
    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
    
    • link/can: 设备类型为 CAN
    • promiscuity 0: 设备未设置为混杂模式
    • can state ERROR-WARNING: 当前 CAN 状态为错误警告,表示有一定数量的错误,系统仍在警告状态。berr-counter tx 128 rx 0 表示发送错误计数为 128,接收错误计数为 0。
    • restart-ms 1000: 重新启动等待时间为 1000 毫秒
    • bitrate 250000: CAN 总线比特率为 250 kbps
    • sample-point 0.866: 采样点位置为 86.6%
    • tq 266: 时间量度为 266 个时间量度单元
    • prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1: CAN 时间段配置:
      • prop-seg (传播段): 6
      • phase-seg1 (相位段 1): 6
      • phase-seg2 (相位段 2): 2
      • sjw (同步跳转宽度): 1
    • flexcan: tseg1 4…16 tseg2 2…8 sjw 1…4 brp 1…256 brp-inc 1: FLEXCAN 模块的时间段参数:
      • tseg1 (时间段 1): 范围 4 到 16
      • tseg2 (时间段 2): 范围 2 到 8
      • sjw (同步跳转宽度): 范围 1 到 4
      • brp (比特率分频器): 范围 1 到 256,增量为 1
    • clock 30000000: CAN 时钟频率为 30 MHz
  3. 错误计数

    re-started bus-errors arbit-lost error-warn error-pass bus-off
    0          0          0          1          0          0
    
    • re-started: 重新启动次数为 0
    • bus-errors: 总总线错误次数为 0
    • arbit-lost: 仲裁丢失次数为 0
    • error-warn: 错误警告次数为 1
    • error-pass: 错误被动模式次数为 0
    • bus-off: 总线关闭次数为 0
  4. 接收和发送统计

    RX: bytes  packets  errors  dropped overrun mcast
    8          1        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0
    
    • RX (接收)
      • bytes: 接收到的字节数为 8
      • packets: 接收到的数据包数为 1
      • errors: 接收错误数为 0
      • dropped: 被丢弃的数据包数为 0
      • overrun: 接收溢出次数为 0
      • mcast: 多播数据包数为 0
    • TX (发送)
      • bytes: 发送的字节数为 0
      • packets: 发送的数据包数为 0
      • errors: 发送错误数为 0
      • dropped: 被丢弃的数据包数为 0
      • carrier: 载波错误数为 0
      • collsns: 碰撞次数为 0

总结

  • can1 设备处于错误警告状态,说明有错误发生,但系统仍在运行。
  • 发送队列的长度设置为 10,但目前没有数据包被发送或接收。
  • 检查设备状态和配置是否正常,特别是查看和处理错误警告(error-warn),并确保 CAN 总线上的所有设备都配置正确,且总线负载在合理范围内。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐