> 技术文档 > 【开源分享】can-utils:深入解析 Linux CAN 工具集

【开源分享】can-utils:深入解析 Linux CAN 工具集

【开源分享】can-utils:深入解析 Linux CAN 工具集


文章目录

  • 深入解析 Linux CAN 工具集:can-utils 完全指南
    • 什么是 can-utils?
    • 核心工具介绍
      • 1. 基础工具
      • 2. 高级工具
      • 3. CAN FD 工具
      • 4. J1939 协议工具
      • 5. ISO-TP 工具
    • 实际应用案例
      • 案例1:汽车 ECU 通信分析
      • 案例2:CAN 总线负载测试
      • 案例3:ISO-TP 诊断协议交互
    • 安装与配置
      • Ubuntu/Debian 安装
      • 从源码编译
      • 交叉编译(如 aarch64)
    • 高级技巧
    • 常见问题解决
    • 结语

深入解析 Linux CAN 工具集:can-utils 完全指南

CAN (Controller Area Network) 总线是汽车电子和工业自动化领域广泛使用的通信协议。在 Linux 系统中,SocketCAN 子系统提供了对 CAN 设备的支持,而 ​​can-utils​​ 则是与之配套的用户空间工具集。本文将全面介绍 can-utils 的功能、使用方法和实际应用场景。


什么是 can-utils?

can-utils 是 Linux-CAN/SocketCAN 项目的官方工具集,提供了一系列用于配置、监控和测试 CAN 总线的命令行工具。这些工具可以直接与 Linux 内核的 SocketCAN 接口交互,无需额外的驱动或中间件。

项目地址:https://github.com/linux-can/can-utils


核心工具介绍

1. 基础工具

  • ​candump​​ - CAN 数据监听器

    candump can0 # 监听 can0 接口的所有帧candump can0,123:7FF # 监听特定 CAN ID 范围
  • ​cansend​​ - 发送单帧 CAN 数据

    cansend can0 123#1122334455667788
  • ​cangen​​ - CAN 帧生成器

    cangen can0 # 生成随机 CAN 帧cangen can0 -g 100 -I 123 -D 1122334455667788 # 指定参数生成
  • ​canbusload​​ - CAN 总线负载监控

    canbusload can0@1000000 # 监控 1Mbps 总线的负载

2. 高级工具

  • ​canplayer​​ - 重放记录的 CAN 数据

    canplayer -I candump.log
  • ​cansniffer​​ - 交互式 CAN 嗅探器

    cansniffer -l can0
  • ​cangw​​ - CAN 网关工具

    cangw -A -s can0 -d can1 -e # 将 can0 的帧转发到 can1

3. CAN FD 工具

  • ​canfdtest​​ - CAN FD 测试工具

    canfdtest can0

4. J1939 协议工具

  • ​j1939cat​​ - J1939 数据交互工具

    j1939cat -r can0:0x80
  • ​j1939spy​​ - J1939 协议监听器

    j1939spy can0

5. ISO-TP 工具

  • ​isotpsend/isotprecv​​ - ISO-TP 协议收发工具

    isotprecv can0 -s 7E0 -d 7E8isotpsend can0 -s 7E0 -d 7E8 -p 00 11 22 33

实际应用案例

案例1:汽车 ECU 通信分析

# 监听所有 CAN 帧并记录candump -l can0# 过滤特定 ECU 的通信 (假设 ECU ID 为 0x7E0)candump can0,7E0:7FF

案例2:CAN 总线负载测试

# 在 can0 上生成高负载流量cangen can0 -g 0 -D i -L 8 -p 10# 在另一个终端监控总线负载canbusload can0@500000 # 500kbps 总线

案例3:ISO-TP 诊断协议交互

# 终端1:启动接收端isotprecv can0 -s 7E0 -d 7E8# 终端2:发送诊断请求isotpsend can0 -s 7E8 -d 7E0 -p 01 0A

安装与配置

Ubuntu/Debian 安装

sudo apt install can-utils

从源码编译

git clone https://github.com/linux-can/can-utils.gitcd can-utilsmakesudo make install

交叉编译(如 aarch64)

make CC=aarch64-linux-gnu-gcc AR=aarch64-linux-gnu-ar

高级技巧

  1. ​使用 candump 过滤特定帧​​:

    candump can0,123:7FF,456:7FF # 只监听 ID 0x123 和 0x456
  2. ​记录和重放 CAN 数据​​:

    # 记录candump -l can0# 重放canplayer -I candump.log
  3. ​组合使用工具​​:

    candump can0 | grep \"123\" | cansend can1
  4. ​使用 cansniffer 进行实时分析​​:

    cansniffer -l can0 -t 0.5 -a

常见问题解决

  1. ​\"SIOCGIFINDEX: No such device\" 错误​

    • 确保 CAN 接口已正确配置:

      sudo ip link set can0 type can bitrate 500000sudo ip link set up can0
  2. ​CAN FD 无法工作​

    • 确保内核支持 CAN FD 并正确配置接口:

      sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on
  3. ​权限问题​

    • 将用户加入 dialout 组或使用 sudo:

      sudo usermod -a -G dialout $USER

结语

can-utils 工具集为 Linux 平台上的 CAN 总线开发提供了强大支持,从简单的帧收发到复杂的协议分析都能胜任。掌握这些工具可以大大提高汽车电子、工业控制等地方的开发效率。建议读者结合具体项目实践,逐步探索这些工具的高级用法。

​延伸阅读​​:

  • SocketCAN 官方文档

  • CAN 协议详解

  • J1939 协议标准