WSL2下使用can-utils操作socketCAN收发CAN数据,DroneCAN/UAVCAN调试器,USB-CAN模块

哈喽大家好,我是Mokel,这是DroneCAN调试器视频的第4期,这期视频我们将介绍在WSL2下使用can-utils工具集利用Linux的socketCAN收发CAN数据的内容。

视频内容主要分为两部分,第一部分我们将介绍如何在Windows下启用和设置WSL2,在这里我们需要手动启用Linux内核的CAN支持并用该内核替换WSL2的默认内核,如果你的WSL2未操作过此部分内容那么你需要参考视频的介绍对WSL2进行相关设置与替换;第二部分则演示在WSL2下使用can-utils工具集并利用socketCAN与Pogo-DroneCAN调试器建立连接并通信,在这里我们依旧使用两个Pogo-DroneCAN调试器互连来进行CAN数据的收发。

你可以在淘宝搜索"DroneCAN调试器"找到这个商品,也可以通过评论区置顶链接(item.taobao.com/item.htm?sp...) 直接跳转商品,调试器默认为slcan固件,同时支持使用QGC更新固件,我将在后续视频里分享利用QGC更新固件的过程,并介绍官方提供的几个可用固件。

虽然最新的Windows系统已经支持一键安装WSL2子系统,你可以查看链接阅读Microsoft的详细教程(learn.microsoft.com/zh-cn/windo...) ,但我推荐使用手动的方式来完成WSL2的安装并进行linux内核替换,我在视频中也将采用手动的方式来完成WSL2的安装,你可以查看Microsoft的旧版 WSL 的手动安装步骤教程了解更多详细信息(learn.microsoft.com/zh-cn/windo...) 。我在视频中就不对这部分内容进行详细介绍了,需要注意的是,在安装Linux发行版时,记得安装Ubuntu20 latest 稳定版,比如在这里我安装的发行版是Ubuntu20.04,如果你遇到了其他什么问题可以评论留言。

完成WSL2的安装后,打开Windows终端,在命令行中输入wsl即可进入WSL2子系统。

我推荐你将apt源更换为国内源,亦或者你可以选择使用稳定快速的网络代理,在这里我将更换为下面的清华源:

ruby 复制代码
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security multiverse

通过cd /etc/apt/进入对应的文件夹下,ls -al显示文件夹的所有内容,可以看到有一个sources.list文件,通过sudo cp sources.list sources.list.bak命令将该文件备份以下,然后sudo vim sources.list打开该文件,将原有内容全部注释掉,然后将上面的清华源复制粘贴到该文件,随后通过:wq保存并退出该文件。由于我已经进行了相关操作,所以此处我仅演示示意一下。

更新了sources.list文件后,依次通过sudo apt-get updatesudo apt-get upgrade更新下载源。

完成了这些设置与更新后,我们来使用自定义的Linux内核替换WSL2的默认内核。首先,通过uname -r查看当前内核版本是什么,比如我的输出为5.15.90.3-microsoft-standard-WSL2-CAN+,由于我已经将WSL2的内核替换为我自定义编译的linux内核,且给内核命名添加了CAN后缀,所以此处我的输出结果与你的输出结果是不同的;另外需要注意的是,我强烈建议无论你的内核版本是多少,在这篇文章发布后的一定时期内,你都采用与我一样的内核版本即5.15.90.3,如果你使用其他的内核版本,那么你需要注意在后续步骤中可能出现的与我视频中所演示情况不一样的地方,如果你遇到一些棘手的问题,可以评论留言。

然后我们将 WSL-Linux-Kernel 仓库(github.com/microsoft/W...) 的代码clone到本地,你可以通过--filter=blob:none来加快克隆的速度,但很明显,你还是需要使用一些网络代理的手段来加快克隆速度;下载完成后,cd WSL2-Linux-Kernel进入该文件夹,并通过git checkout linux-msft-wsl-5.15.90.3切换到新分支,此时,你可以用VSCode或IDE打开该仓库,以便更加清晰地执行后续操作。

在继续操作之前,我们先在WSL2下安装一些依赖,你需要注意,我所演示安装的依赖是基于我当前的系统情况而决定的,在你安装完这些依赖并继续后续的操作时,你可能会遇到警告,提示你缺少相关依赖,那么你需要自行安装所提示的依赖,亦或者你会遇到报错,那么你可以搜索错误信息并根据博客的内容安装缺少的依赖。

在这里,我将安装以下这几个依赖,依次执行sudo apt updatesudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool完成这些依赖的安装;你可以看到,我都已经安装过这些依赖了。

回到VSCode中,可以看到项目根目录下有一个.config文件,先删除它,或者cp .config .config.old备份一下再删除.config文件,然后在项目根目录下执行cp Microsoft/config-wsl .config将Microsoft文件夹的config-wsl文件复制到项目根目录下并重命名为.config。

然后在项目根目录下执行sudo make menuconfig,在 Networking support -> CAN BUS subsystem support下,按M把他们和他们下面的选项都变成module,把能选的全选了,按M没反应变不成module的就按y让它变成build-in的,如我所演示,注意每一级都要勾选,千万别漏掉了;由于我已经更新过了,所以你可以看到我的所有选项及子选项都已经勾选上了。

全部勾选完成后,光标切换到Save,按Enter保存,注意命名为.config;保存成功后,界面会回到终端。此时,在VSCode中打开.config文件,将 CONFIG_LOCALVERSION 的值设置为 5.15.90.3-microsoft-standard-WSL2-CAN,这样的话,在完成对WSL2默认内核的替换后,你可以明确地判断出用于替换的内核是该内核。

接下来我们就可以开始编译自定义的linux内核了,回到 WSL-Linux-Kernel 项目根目录下,先执行sudo make -j16命令,注意,这里的16指的是你的设备的逻辑内核数,比如,我的设备有8个物理核心,有16个逻辑核心,因此这里数值为16;然后再依次执行sudo make modules_installsudo make install编译linux内核。

如果你在编译过程中遇到相关报错,你可以搜索关键词寻找解决方案,或者在评论区留言;编译完成后,执行cp arch/x86/boot/bzImage /mnt/c/Users/98297/can_bzImage命令将bzImage文件复制到wsl2系统外注意将98297替换为你的用户名,并在C:\Users\98297目录下创建.wslconfig文件,在其中添加配置信息,然后保存并关闭文件,如我所演示。

关闭VSCode和重开Windows终端,依次执行wsl --shutdownwsl重启并进入WSL2子系统,然后执行uname -r命令查看现在的linux内核,可以看到,已经更新为了我们自定义的linux内核,至此,我们便完成了WSL2子系统的启用及设置,并且将WSL2子系统的默认linux内核更换为了我们自定义的linux内核。

接下来,我们就可以安装can-utils工具集,并利用两个Pogo-DroneCAN调试器互连来演示WSL2下的CAN数据收发,需要注意的是,我们先要把USB设备从Windows挂载到WSL2子系统才能在WSL2下连接和使用USB设备,因此在Windows终端里执行winget install --interactive --exact dorssel.usbipd-win安装usbipad工具,安装完成后,在终端中依次执行wsl --shutdownwsl重启并进入WSL2子系统,在WSL2子系统下依次执行sudo apt install linux-tools-virtual hwdatasudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20命令完成相关设置。

在进行下一步操作前,如我所演示,我们需要将两个DroneCAN调试器的GH1.25口通过一根双头反向端子线连接在一起,然后将调试器通过TypeC线连接到电脑上,你应该还记得我们在第2期视频中提到在Windows下直接使用dronecan_gui_tool上位机连接Pogo-DroneCAN调试器时需要依次将调试器连接到电脑,现在我们是在WSL2子系统下连接调试器并通信,不再受到此约束。

新开一个Windows终端,在命令行中执行usbipd wsl list命令查看Devices,如我所演示,1-1,1-2这两个STM...Virtual COM Port就是系统识别到的Pogo-DroneCAN调试器;然后你需要先以管理员角色打开一个新的Windows终端,然后在命令行中依次执行usbipd wsl attach --busid 1-1usbipd wsl attach --busid 1-2将这两个设备挂载到WSL2子系统上,完成挂载后,在命令行中执行wsl命令进入WSL2子系统,在WSL2下执行lsusb命令,可以看到有两个Bus Devices就是我们刚刚成功挂载的Pogo-DroneCAN调试器。

完成了Pogo-DroneCAN调试器的挂载后,回来继续安装can-utils工具集,在WSL2下执行sudo apt install can-utils安装can-utils,并依次执行sudo modprobe cansudo modprobe can-rawsudo modprobe can-gwsudo modprobe slcansudo modprobe vcan完成socketCAN的相关设置。

在命令行中执行ls /dev/tty*命令查看相关的硬件设备信息,其中/dev/ttyACM0/dev/ttyACM1这两个设备就是连接到电脑的Pogo-DroneCAN调试器,然后在命令行中依次执行sudo slcand -o -c -s8 /dev/ttyACM0 can0sudo slcand -o -c -s8 /dev/ttyACM1 can1sudo ifconfig can0 upsudo ifconfig can1 up命令来创建并启动can0和can1;注意观察,你会发现刚刚在执行slcand命令时,两个DroneCAN调试器的呼吸灯都进行了一次闪烁,你可以把这个理解为是调试器正常工作的一个前置信号;在创建完成后,执行ifconfig可以看到已经有了can0和can1。

最后我们在一个命令行中执行sudo candump can1命令监听can1的数据,在另外一个命令行中执行cansend can0 123#0011命令向can0发送数据,可以看到can1收到了我们向can0发送的数据,这意味着我们向can0发送的数据,通过socketCAN以slcan协议从电脑发送到了DroneCAN调试器a,该调试器将slcan协议数据转换为dronecan协议数据后再发送给DroneCAN调试器b,DroneCAN调试器b接收到数据并将dronecan协议数据转换为slcan协议数据后回传给电脑,此时socketCAN将slcan协议包装后回显到我们的can1上。

经过一个完整的发送、转换、传递、转换、回传环节的收发数据完全一致,这意味着DroneCAN调试器已经正常地工作了;后续,你可以将其中一个调试器更换为你的DroneCAN外设并给外设通电,然后外设将持续产生dronecan协议的数据发送给DroneCAN调试器,调试器将dronecan协议的数据转换为slcan协议数据后回传给电脑,此时你就可以根据外设的实际数据进行相关开发调试工作了,我将在后续视频中演示测试DroneCAN调试器与CANGPS外设之间的连接与调试。

那么这期视频就到这里了,记得点赞投币收藏和关注,我们下期视频,不见不散!

相关推荐
coderWangbuer29 分钟前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql
攸攸太上35 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志38 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
sky丶Mamba1 小时前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
千里码aicood2 小时前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
程序员-珍2 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
liuxin334455663 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
数字扫地僧3 小时前
HBase与Hive、Spark的集成应用案例
后端
架构师吕师傅3 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
bug菌4 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee