1. PCAN驱动与Ubuntu版本适配的那些事儿第一次在Ubuntu上折腾PCAN驱动时我对着满屏的报错信息差点崩溃。后来才发现这玩意儿对系统版本敏感得像老式收音机调频差0.1的版本号都可能让你白忙活半天。PCAN作为工业级CAN总线设备在自动驾驶和机器人领域用得特别多但它的Linux驱动安装就像在玩俄罗斯套娃——解压完一个压缩包里面还有压缩包编译完一个模块又缺另一个依赖。我经手过的项目里Ubuntu 18.04.1和18.04.4这两个看似双胞胎的版本需要的PCAN驱动版本竟然完全不同。前者要用peak-linux-driver-8.8.0后者必须上8.9.3版用错了就会在modprobe pcan这步报各种灵异错误。这就像给Windows 7和Windows 10装显卡驱动虽然都叫Win7/Win10但版本号差一位就可能导致蓝屏。2. 从零开始的驱动安装指南2.1 基础环境搭建装驱动前得先把场子搭好就像做菜得先备齐调料。在Ubuntu终端里先跑这几个命令sudo apt-get update sudo apt-get install build-essential libncurses-dev libssl-dev特别是libpcan这个祖宗它依赖libusb库。我建议直接用apt安装稳定版sudo apt-get install libusb-1.0-0-dev要是你非要手动编译最新版libusb比如1.0.22记得装完检查下动态库路径ls /usr/local/lib/libusb-1.0.so*有次我遇到个坑手动编译的libusb没被系统识别最后发现是要执行sudo ldconfig更新库缓存。这种问题最折磨人明明装好了却用不了就像钥匙明明在口袋里却死活摸不到。2.2 驱动包的选择玄学官网的peak-linux-driver有好几个版本下错版本就像给特斯拉装五号电池。根据我的踩坑记录Ubuntu版本推荐驱动版本致命陷阱16.04 LTSpeak-linux-driver-8.3内核版本不能超过4.1518.04.1 LTSpeak-linux-driver-8.8需要手动修改install脚本18.04.4 LTSpeak-linux-driver-8.9必须禁用Secure Boot特别提醒看到网上的教程说直接make就行那都是骗小白的现在的驱动包结构变了得先处理那个套娃式的CMake工程。我建议按这个流程操作wget https://www.peak-system.com/linux/driver/peak-linux-driver-8.9.3.tar.gz tar -xzf peak-linux-driver-8.9.3.tar.gz cd peak-linux-driver-8.9.3 make PCINO PARNO ISANO注意那些PCINO参数它们告诉编译器跳过不用的接口模块。有次我漏了这些参数编译出的驱动大了三倍加载时直接内核panic吓得我以为把电脑搞坏了。3. 安装过程中的经典翻车现场3.1 头文件失踪之谜最经典的错误就是这个fatal error: libpcan.h: No such file or directory明明/usr/local/include/libpcan/下面躺着libpcan.h编译器就是找不到。这是因为gcc默认不搜索/usr/local/include的子目录。我常用的解决方案有三板斧粗暴版直接复制头文件sudo cp /usr/local/include/libpcan/*.h /usr/local/include/优雅版修改编译参数CFLAGS-I/usr/local/include/libpcan make根治版创建符号链接sudo ln -s /usr/local/include/libpcan /usr/include/libpcan最近一次在ROS项目里遇到这个问题发现是catkin_make的环境变量没继承系统路径最后在CMakeLists.txt里加了include_directories(/usr/local/include/libpcan)才解决。3.2 内核模块加载失败当看到这个错误时insmod: ERROR: could not insert module pcan.ko: Unknown symbol in module八成是驱动版本和内核版本对不上。先检查当前内核版本uname -r然后去驱动目录里查看Makefile里的KERNEL_SOURCE路径是否正确。我常用的调试命令组合dmesg | tail -n 20 modinfo pcan.ko depmod -a有次发现是Secure Boot搞的鬼需要在BIOS里关掉它或者手动给模块签名。还有个隐藏坑点某些Ubuntu版本默认开启了内核模块签名验证得用这个命令绕过sudo insmod pcan.ko unsigned4. 版本冲突的终极解决方案4.1 DKMS动态内核支持对于需要频繁切换内核的开发者我强烈推荐用DKMS管理PCAN驱动sudo apt-get install dkms cd peak-linux-driver-8.9.3 sudo make install DKMSYES这样每次更新内核后驱动会自动重新编译。我在一台测试机上验证过从5.4.0-42到5.4.0-135共7个内核版本都能无缝切换。DKMS的工作原理就像给每个内核版本定制西装比静态编译的均码驱动靠谱多了。4.2 多版本共存方案有些项目需要同时支持新旧版PCAN设备这时可以玩点花活sudo cp pcan.ko /lib/modules/$(uname -r)/kernel/drivers/pcan/pcan_v2.ko sudo depmod -a然后通过设备号区分版本# 新版设备 sudo modprobe pcan # 旧版设备 sudo modprobe pcan_v2我在机器人项目里就这么干的通过udev规则自动加载对应版本ACTIONadd, SUBSYSTEMusb, ATTRS{idVendor}0c72, ATTRS{idProduct}000c, RUN/sbin/modprobe pcan5. 实战中的疑难杂症最近在Ubuntu 20.04上遇到个奇葩问题驱动编译正常但dmesg里一直报pcan: no device found。最后发现是新版内核的USB3.0驱动会干扰PCAN设备枚举。解决方案是在grub里加上usbcore.quirks0c72:000c:u参数sudo nano /etc/default/grub # 在GRUB_CMDLINE_LINUX_DEFAULT后追加 sudo update-grub还有个更隐蔽的坑——某些主板USB接口供电不足会导致PCAN设备时断时连。我的判断方法是lsusb -v -d 0c72:000c | grep MaxPower如果输出值小于500mA建议换USB接口或者接外接电源。有次在工控机上调试换了三个USB口才稳定后来发现是主板南桥芯片的供电设计缺陷。
Ubuntu系统下PCAN驱动安装的版本适配与疑难解决
发布时间:2026/5/27 7:47:19
1. PCAN驱动与Ubuntu版本适配的那些事儿第一次在Ubuntu上折腾PCAN驱动时我对着满屏的报错信息差点崩溃。后来才发现这玩意儿对系统版本敏感得像老式收音机调频差0.1的版本号都可能让你白忙活半天。PCAN作为工业级CAN总线设备在自动驾驶和机器人领域用得特别多但它的Linux驱动安装就像在玩俄罗斯套娃——解压完一个压缩包里面还有压缩包编译完一个模块又缺另一个依赖。我经手过的项目里Ubuntu 18.04.1和18.04.4这两个看似双胞胎的版本需要的PCAN驱动版本竟然完全不同。前者要用peak-linux-driver-8.8.0后者必须上8.9.3版用错了就会在modprobe pcan这步报各种灵异错误。这就像给Windows 7和Windows 10装显卡驱动虽然都叫Win7/Win10但版本号差一位就可能导致蓝屏。2. 从零开始的驱动安装指南2.1 基础环境搭建装驱动前得先把场子搭好就像做菜得先备齐调料。在Ubuntu终端里先跑这几个命令sudo apt-get update sudo apt-get install build-essential libncurses-dev libssl-dev特别是libpcan这个祖宗它依赖libusb库。我建议直接用apt安装稳定版sudo apt-get install libusb-1.0-0-dev要是你非要手动编译最新版libusb比如1.0.22记得装完检查下动态库路径ls /usr/local/lib/libusb-1.0.so*有次我遇到个坑手动编译的libusb没被系统识别最后发现是要执行sudo ldconfig更新库缓存。这种问题最折磨人明明装好了却用不了就像钥匙明明在口袋里却死活摸不到。2.2 驱动包的选择玄学官网的peak-linux-driver有好几个版本下错版本就像给特斯拉装五号电池。根据我的踩坑记录Ubuntu版本推荐驱动版本致命陷阱16.04 LTSpeak-linux-driver-8.3内核版本不能超过4.1518.04.1 LTSpeak-linux-driver-8.8需要手动修改install脚本18.04.4 LTSpeak-linux-driver-8.9必须禁用Secure Boot特别提醒看到网上的教程说直接make就行那都是骗小白的现在的驱动包结构变了得先处理那个套娃式的CMake工程。我建议按这个流程操作wget https://www.peak-system.com/linux/driver/peak-linux-driver-8.9.3.tar.gz tar -xzf peak-linux-driver-8.9.3.tar.gz cd peak-linux-driver-8.9.3 make PCINO PARNO ISANO注意那些PCINO参数它们告诉编译器跳过不用的接口模块。有次我漏了这些参数编译出的驱动大了三倍加载时直接内核panic吓得我以为把电脑搞坏了。3. 安装过程中的经典翻车现场3.1 头文件失踪之谜最经典的错误就是这个fatal error: libpcan.h: No such file or directory明明/usr/local/include/libpcan/下面躺着libpcan.h编译器就是找不到。这是因为gcc默认不搜索/usr/local/include的子目录。我常用的解决方案有三板斧粗暴版直接复制头文件sudo cp /usr/local/include/libpcan/*.h /usr/local/include/优雅版修改编译参数CFLAGS-I/usr/local/include/libpcan make根治版创建符号链接sudo ln -s /usr/local/include/libpcan /usr/include/libpcan最近一次在ROS项目里遇到这个问题发现是catkin_make的环境变量没继承系统路径最后在CMakeLists.txt里加了include_directories(/usr/local/include/libpcan)才解决。3.2 内核模块加载失败当看到这个错误时insmod: ERROR: could not insert module pcan.ko: Unknown symbol in module八成是驱动版本和内核版本对不上。先检查当前内核版本uname -r然后去驱动目录里查看Makefile里的KERNEL_SOURCE路径是否正确。我常用的调试命令组合dmesg | tail -n 20 modinfo pcan.ko depmod -a有次发现是Secure Boot搞的鬼需要在BIOS里关掉它或者手动给模块签名。还有个隐藏坑点某些Ubuntu版本默认开启了内核模块签名验证得用这个命令绕过sudo insmod pcan.ko unsigned4. 版本冲突的终极解决方案4.1 DKMS动态内核支持对于需要频繁切换内核的开发者我强烈推荐用DKMS管理PCAN驱动sudo apt-get install dkms cd peak-linux-driver-8.9.3 sudo make install DKMSYES这样每次更新内核后驱动会自动重新编译。我在一台测试机上验证过从5.4.0-42到5.4.0-135共7个内核版本都能无缝切换。DKMS的工作原理就像给每个内核版本定制西装比静态编译的均码驱动靠谱多了。4.2 多版本共存方案有些项目需要同时支持新旧版PCAN设备这时可以玩点花活sudo cp pcan.ko /lib/modules/$(uname -r)/kernel/drivers/pcan/pcan_v2.ko sudo depmod -a然后通过设备号区分版本# 新版设备 sudo modprobe pcan # 旧版设备 sudo modprobe pcan_v2我在机器人项目里就这么干的通过udev规则自动加载对应版本ACTIONadd, SUBSYSTEMusb, ATTRS{idVendor}0c72, ATTRS{idProduct}000c, RUN/sbin/modprobe pcan5. 实战中的疑难杂症最近在Ubuntu 20.04上遇到个奇葩问题驱动编译正常但dmesg里一直报pcan: no device found。最后发现是新版内核的USB3.0驱动会干扰PCAN设备枚举。解决方案是在grub里加上usbcore.quirks0c72:000c:u参数sudo nano /etc/default/grub # 在GRUB_CMDLINE_LINUX_DEFAULT后追加 sudo update-grub还有个更隐蔽的坑——某些主板USB接口供电不足会导致PCAN设备时断时连。我的判断方法是lsusb -v -d 0c72:000c | grep MaxPower如果输出值小于500mA建议换USB接口或者接外接电源。有次在工控机上调试换了三个USB口才稳定后来发现是主板南桥芯片的供电设计缺陷。