如何在linux上创建虚拟CAN

如何在Linux上创建虚拟CAN

当开发CAN节点时,虚拟CAN接口是完美的解决方案,不需要实际的物理CAN总线。可以将虚拟CAN接口看作是一个软件层面的CAN适配器,通过它可以访问模拟CAN总线。Linux内核的SocketCAN子系统内置了对虚拟CAN接口的支持。
本教程详细介绍了如何在Linux系统上创建和使用虚拟CAN接口。

背景

当您想要开发、原型化、模拟或测试CAN节点,而没有实际的物理CAN总线时,虚拟CAN接口提供了一种解决方案。把虚拟CAN接口想象成一个软件CAN适配器,它可以访问计算机内的模拟CAN总线。不需要一个CAN硬件适配器来访问CAN总线。

在Linux上,内核SocketCAN直接提供CAN功能。SocketCAN不仅包含硬件驱动程序和CAN的网络协议栈,还对虚拟CAN设备支持。本教程详细介绍了如何在Linux上创建和使用虚拟CAN接口。分别介绍手动创建虚拟CAN接口和自动创建方法,以便在Linux系统重启后,虚拟CAN接口仍然存在。

虚拟CAN接口的唯一限制是不能直接访问硬件CAN节点。但是,您可以使用CAN网关内核模块can-gw,并在物理CAN总线和虚拟CAN总线之间路由消息,以绕过这个限制。这块的内容暂不介绍。

环境准备

提出虚拟CAN接口的背景是因为不需要实际的CAN硬件设备,因此,只需要一个树莓派或者一台虚拟机就足够了,如果喜欢linux开发的话,直接安装一个linux桌面系统也是可以的。

创建虚拟CAN接口

在Linux上能使用虚拟CAN接口之前,需要在终端执行以下三个步骤:

  1. 加载vcan内核模块: sudo modprobe vcan
  2. 创建虚拟CAN接口: sudo ip link add dev vcan0 type vcan
  3. 将虚拟CAN接口处于在线状态: sudo ip link set up vcan0

然后,通过命令ip addr | grep "can" 来验证是否可用并处于在线状态

xxx@O-XiaoXinPro:~$ sudo modprobe vcan
xxx@O-XiaoXinPro:~$ sudo ip link add dev vcan0 type vcan
xxx@O-XiaoXinPro:~$ sudo ip link set up vcan0
xxx@O-XiaoXinPro:~$ ip addr | grep "can"
3: vcan0: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UNKNOWN group default qlen 1000
    link/can 

上述终端命令日志展示了创建虚拟CAN接口并查看状态的命令。

如果您以前在Linux下使用过真实的CAN硬件,你会注意到一个区别:ip addr命令的输出显示状态为UNKNOWN,而不是UP。因为我们用的是虚拟CAN,属于正常。

注意,不需要为Linux上的虚拟CAN接口配置CAN比特率。SocketCAN子系统模拟CAN总线,它不需要做任何通信同步。

也可以通过shell脚本来自动化实现以上步骤:

#!/bin/bash
# Make sure the script runs with super user priviliges.
[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"
# Load the kernel module.
modprobe vcan
# Create the virtual CAN interface.
ip link add dev vcan0 type vcan
# Bring the virutal CAN interface online.
ip link set up vcan0

将这些内容保存到主目录中的一个文件中。例如:~/vcan.sh。然后将其标记为可执行文件:chmod +x ~/vcan.sh
从现在开始,只需要运行这个脚本就可以在你的Linux系统上获得vcan0虚拟CAN接口:

cd ~
./vcan.sh

注意,脚本会自动提示您输入sudo密码。

使用 can-utils 测试CAN通信

接下来我们要基于上面创建的虚拟CAN接口,来测试一下CAN通信情况。工具包 can-utils 是一个命令行工具,可以完美的满足我们的需求。我们只需要在电脑上安装一下这个工具包即可:

Ubuntu/Debian: sudo apt install can-utils
Fedora: sudo dnf install can-utils
openSUSE: sudo zypper install canutils

安装示例

xxx@O-XiaoXinPro:~$ sudo apt install can-utils
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
下列【新】软件包将被安装:
  can-utils
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 16 个软件包未被升级。
需要下载 134 kB 的归档。
解压缩后会消耗 720 kB 的额外空间。
获取:1 http://cn.archive.ubuntu.com/ubuntu jammy/universe amd64 can-utils amd64 2020.11.0-1 [134 kB]
已下载 134 kB,耗时 3(46.1 kB/s) 
正在选中未选择的软件包 can-utils。
(正在读取数据库 ... 系统当前共安装有 239975 个文件和目录。)
准备解压 .../can-utils_2020.11.0-1_amd64.deb  ...
正在解压 can-utils (2020.11.0-1) ...
正在设置 can-utils (2020.11.0-1) ...
正在处理用于 man-db (2.10.2-1) 的触发器 ...

接下来,我们打开两个终端窗口,一个是用来查看所有的CAN消息,另一个是用来发送CAN消息。
在用来查看CAN消息的终端中执行以下命令:

candump -tz vcan0

在用来发送CAN消息的终端中,模拟发送CAN请求:

cansend vcan0 123#00FFAA5501020304

在发送完CAN请求后,就会在第一个查看CAN消息的终端中看到发送的CAN消息:

  • 发送CAN信息
xxx@O-XiaoXinPro:~$ cansend vcan0 123#00FFAA5501020304
xxx@O-XiaoXinPro:~$ cansend vcan0 123#00FFAA5501020304
  • 查看CAN信息
xxx@O-XiaoXinPro:~$ candump -tz vcan0
 (000.000000)  vcan0  123   [8]  00 FF AA 55 01 02 03 04
 (005.223916)  vcan0  123   [8]  00 FF AA 55 01 02 03 04

从上面的输出可以验证使用新创建的vcan0虚拟CAN接口可以正常进行CAN通信。

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值