你好,世界!
汽车行业的人都知道 CAN 总线是一个非常重要而且被广泛使用的车内网络通信协议。它最初是由德国博世公司在1980年代开发,作为一种串行通讯协议解决汽车电子系统中多个控制单元之间的通信问题。
CAN 总线具有高可靠性、实时性和很好的抗干扰能力,适合在较恶劣的汽车环境中使用。它可以应用在发动机控制和底盘控制等高安全等级领域,也可以应用到车身电子和信息娱乐系统等领域。
CAN 总线采用多主结构,即 CAN 网络中任何一个节点都可以主动发送数据,而不是依赖于一个主控制器。它可以灵活地组成多种网络拓扑结构,比如线形、星形和树形。
CAN 总线使用消息帧来传输数据。消息帧包括标识符(ID)、数据字段、控制字段和校验字段等。其中标识符可以用来决定消息的优先级:ID 越小,优先级越高。
CAN 总线经过发展,有使用11位标识符的 CAN 2.0A 标准 CAN,有支持11位和29位标识符的 CAN 2.0B 扩展,还有支持更高传输速率和更大数据帧的 CAN FD。
此外,还有一些重要的汽车应用协议是以 CAN 总线为基础的。比如车载诊断系统(OBD-II)就是使用 CAN 总线来读取车辆的故障码等数据的,通常使用 CAN 来支持 UDS 诊断协议。
目前,广泛应用于汽车行业 CAN 网络的软件工具和硬件设备主要是围绕德国 Vector 公司的 CANoe 软件和 VN 系列硬件。它可用于网络仿真、通信分析、测试自动化、诊断支持和数据记录及回放。遗憾的是,CANoe 作为专有软件只支持 Windows 操作系统,它没有 GNU/Linux 系统下的版本。那么,在 GNU/Linux 系统下如何进行 CAN 总线相关的开发呢?
SocketCAN 是 Linux 内核自带的 CAN 协议栈,无需单独安装。它提供了标准的网络接口来访问 CAN 总线,也支持多种 CAN 控制器,比如 USB-to-CAN 转换器。它适用于 CAN 通信开发、数据监控和测试。
它的使用也比较简单,可以在命令行使用:
ip addr ls dev can0 # 查看 can0 接口信息
sudo ip link set can0 type can bitrate 500000 # 配置 can0 接口参数
sudo modprobe can && sudo ip link set up can0 # 启用 can0 接口
sudo apt install can-utils # 安装 CAN 实用工具
cansend can0 123#5555666677778888 # 发送 ID 为 0x123 的数据
# [0x55, 0x55, 0x66, 0x66, 0x77, 0x77, 0x88, 0x88]
candump can0 # 实时接收 CAN 总线数据
CANTools 是一款用 Python 编写的 CAN 实用工具,它以 MIT 许可证发布。它可用于 CAN 数据分析,CAN DBC 文件处理等。它提供多种命令行工具,具体参考文档:CAN BUS tools。
BUSMASTR 是一款以 GNU GPLv3 许可证发布的 CAN 总线分析工具。它支持基于 C 语言的脚本,能够进行 CAN 总线开发、测试和仿真。具体参考文档:BUSMASTER。
Wireshark 是一款以 GNU GPLv2 许可证发布的网络协议分析工具,支持 CAN 协议。它有强大的过滤和搜索功能,并支持多种文件格式,适用于 CAN 数据包分析。具体参考文档:Wireshark。
PCAN-USB 是 PEAK System 公司推出的一款 USB 接口 CAN 适配器。它的 USB 一端连接电脑,另一端连接 CAN 总线。它提供了 Linux 内核的驱动,通过 SocketCAN,所以 GNU/Linux 内置支持 PCAN-USB 连接。它的设计支持 CAN 2.0A/B 和 CAN FD。PCAN-USB 可用于 CAN 通信的开发和测试。
它的使用也比较简单,可以在命令行使用:
grep PEAK_ /boot/config-`unmae -r` # 检查 PEAK-CAN 内核驱动
lsmod | grep ^peak # 列出以 peak 开头的设备
sudo modprobe peak_usb # 启用 PEAK-CAN 设备
更多信息,请参考文档:PCAN for Linux。
MCP2515 是 Microchip 推出的一款独立 CAN 控制器芯片。它和 Arduino 配合使用,可以为后者提供 CAN 总线功能,能够支持 CAN 2.0 A/B 标准。其特点是开发简单,成本底,适合车载网络的开发和测试。更多信息,请参考文档:Arduino。
Raspberry Pi 可以通过 CAN HAT(Hardware Attached on Top)扩展板支持 CAN 功能。其特点是可以使用内核 SocketCAN 支持,有成熟的开发环境,适用于嵌入式 CAN 开发。具体参考文档:Raspberry。
总之,在 GNU/Linux 下为车载系统开发和测试 CAN 功能目前已经有了硬件和软件的支持。不过,具体实现和开发的案例以及工具的推广尚需努力。
如果你希望自己的 CAN 项目基于自由软件,那么 立伯乐 或许可以帮你。
让自由软件带你进入的美好自由世界!