Linux 系统创建虚拟 CAN 模拟通信

本文要点

  • 用于没有实体 CAN 硬件时进行协议和应用层调试。
  • 覆盖 vcan 模块加载、虚拟网卡创建与启用。
  • 使用 can-utils 进行 cansend/candump 通信验证。

​在Linux系统中,可以使用SocketCAN框架创建两个虚拟CAN接口(例如vcan0和vcan1),并通过它们模拟CAN总线通信,实现一端发送,另一端接收。以下是具体步骤。

1.加载vcan内核模块,确保已加载虚拟CAN支持的内核模块。

1
sudo modprobe vcan

2.创建两个虚拟CAN接口vcan0和vcan1,并将它们设置为“up”状态。

1
2
3
4
sudo ip link add dev vcan0 type vcan
sudo ip link add dev vcan1 type vcan
sudo ip link set up vcan0
sudo ip link set up vcan1

3.为了使vcan0和vcan1能够相互通信,需要使用cangw(CAN网关)工具将它们桥接起来。首先,确保已安装can-utils工具集,其中包含cangw。

1
sudo apt-get install can-utils

4.启动网关内核模块。

1
sudo modprobe can-gw

5.配置网关,​使用cangw命令将vcan0和vcan1连接起来。

1
2
sudo cangw -A -s vcan0 -d vcan1 -e 
sudo cangw -A -s vcan1 -d vcan0 -e

6.测试通信,使用cansend和candump工具测试两个接口之间的通信。

在一个终端窗口中,监听vcan1上的消息:

1
candump vcan1

在另一个终端窗口中,发送消息到vcan0:

1
cansend vcan0 123#DEADBEEF

如果配置正确,将在监听vcan1的终端中看到类似以下的输出,表示成功接收到从vcan0发送的消息:

1
vcan1  123   [8] DE AD BE EF