当前位置: 首页 > news >正文

保姆级教程:在Ubuntu22.04上为ROS2 Humble搞定CH340串口驱动与权限问题

从零攻克Ubuntu22.04下ROS2 Humble的CH340串口通信全流程

刚接触ROS2的开发者,十有八九会在串口通信这个环节卡壳——尤其是使用CH340这类廉价USB转串口模块时。你可能已经经历过:插上设备后系统毫无反应、代码明明正确却提示权限不足、或是突然冒出的brltty服务冲突。这些问题看似简单,却足以让新手浪费数小时在搜索引擎和论坛之间来回切换。本文将彻底解决Ubuntu22.04+ROS2 Humble环境下CH340模块的三大核心痛点:驱动安装权限配置服务冲突,让你一次性打通硬件连接的"任督二脉"。

1. CH340驱动安装:绕过新系统的签名陷阱

Ubuntu22.04对内核模块签名验证更加严格,直接安装老教程里的CH340驱动往往会遇到Key was rejected by service错误。我们先解决这个"拦路虎":

1.1 驱动安装的正确姿势

首先确认系统是否已识别设备但缺少驱动:

lsusb | grep CH340

若看到1a86:7523 QinHeng Electronics CH340 serial converter之类的信息,继续执行:

# 安装编译依赖 sudo apt update && sudo apt install -y dkms build-essential linux-headers-$(uname -r) # 获取官方驱动(注意分支选择) git clone https://github.com/juliagoda/CH341SER.git cd CH341SER make

此时可能会遇到签名错误,需要临时关闭Secure Boot:

  1. 重启进入BIOS,找到Secure Boot选项禁用
  2. 或使用MOK工具手动签名(适合需要保持Secure Boot的场景):
sudo mokutil --import /path/to/module_signature.der

1.2 验证驱动加载

加载编译好的驱动模块:

sudo insmod ch34x.ko dmesg | grep ch34x

成功时应看到ch34x ttyUSB0: ch34x converter now disconnected from ttyUSB0之类的日志。建议将驱动加入开机加载:

echo "ch34x" | sudo tee -a /etc/modules sudo depmod -a

提示:部分国产CH340变种芯片可能需要特殊驱动,建议用lsusb -v确认具体型号后联系供应商获取驱动。

2. 串口权限配置:一劳永逸的解决方案

解决了驱动问题,接下来就是经典的Permission denied错误。临时方案是用sudo chmod 777 /dev/ttyUSB0,但每次重启都要重复操作。下面介绍三种永久解决方案:

2.1 udev规则法(推荐)

创建规则文件:

sudo nano /etc/udev/rules.d/99-ch34x.rules

加入以下内容(替换<username>为你的用户名):

KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666", GROUP="dialout", OWNER="<username>"

生效规则:

sudo udevadm control --reload-rules sudo udevadm trigger

2.2 用户组方案

将当前用户加入dialout组:

sudo usermod -aG dialout $USER

需要重新登录生效,可通过groups命令验证。

2.3 访问控制列表(ACL)

对特定设备设置持久化权限:

sudo setfacl -m u:$USER:rw- /dev/ttyUSB0 sudo setfacl -m g:dialout:rw- /dev/ttyUSB0

三种方案对比:

方案持久性需要重启适用范围安全等级
udev规则✔️✖️特定设备
用户组✔️✔️所有串口设备
ACL✔️✖️当前设备

3. 消灭brltty服务:隐藏的串口杀手

Ubuntu预装的盲文支持服务brltty会霸占串口设备,导致出现Device or resource busy错误。彻底解决需要以下步骤:

3.1 立即停止服务

sudo systemctl stop brltty-udev.service sudo systemctl disable brltty-udev.service sudo systemctl mask brltty-udev.service

3.2 防止自动复活

删除相关配置文件:

sudo rm /lib/udev/rules.d/*brltty*.rules sudo udevadm control --reload

3.3 验证效果

插拔USB设备后检查:

ls -l /dev/ttyUSB*

应该不再有brltty相关的进程占用。

4. ROS2串口通信实战检验

环境配置完成后,用一个最小示例验证整套流程:

4.1 创建测试包

ros2 pkg create --build-type ament_cmake serial_test cd serial_test/src

4.2 编写测试节点

创建serial_test.cpp文件:

#include "rclcpp/rclcpp.hpp" #include "serial/serial.h" class SerialTest : public rclcpp::Node { public: SerialTest() : Node("serial_test") { try { ser.setPort("/dev/ttyUSB0"); ser.setBaudrate(9600); serial::Timeout timeout = serial::Timeout::simpleTimeout(1000); ser.setTimeout(timeout); ser.open(); RCLCPP_INFO(this->get_logger(), "Serial port opened successfully"); timer_ = create_wall_timer( std::chrono::seconds(1), [this]() { ser.write("Hello CH340\n"); RCLCPP_INFO(this->get_logger(), "Data sent"); }); } catch (const std::exception& e) { RCLCPP_ERROR(this->get_logger(), "Failed to open serial port: %s", e.what()); } } private: serial::Serial ser; rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char** argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<SerialTest>()); rclcpp::shutdown(); return 0; }

4.3 修改CMakeLists.txt

CMakeLists.txt中添加:

find_package(serial REQUIRED) find_package(rclcpp REQUIRED) add_executable(serial_test src/serial_test.cpp) ament_target_dependencies(serial_test rclcpp serial) install(TARGETS serial_test DESTINATION lib/${PROJECT_NAME})

4.4 编译运行

colcon build --packages-select serial_test source install/setup.bash ros2 run serial_test serial_test

正常运行时应该每秒输出一次Data sent日志,同时可以用cutecom等工具接收串口数据验证。

5. 进阶排查与性能优化

当基础功能调通后,还需要注意以下进阶问题:

5.1 多设备稳定识别

当连接多个CH340设备时,建议使用by-id规则避免端口号漂移:

ls -l /dev/serial/by-id/

在代码中使用/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0这样的固定路径。

5.2 波特率自适应

部分CH340模块需要特殊波特率设置:

// 尝试不同波特率 const std::vector<int> baudrates = {9600, 115200, 57600, 38400}; for (int baud : baudrates) { try { ser.setBaudrate(baud); break; } catch (...) { continue; } }

5.3 看门狗机制

添加串口断连自动重连:

void check_connection() { if (!ser.isOpen()) { RCLCPP_WARN(get_logger(), "Reconnecting serial port..."); try { ser.open(); } catch (...) { RCLCPP_ERROR(get_logger(), "Reconnect failed"); } } }
http://www.jsqmd.com/news/745701/

相关文章:

  • PPTist终极指南:3分钟掌握免费在线PPT制作,告别PowerPoint依赖
  • 告别数据灾难:Linux下flash_erase命令的‘锁’与‘备份’实操指南
  • 终极免费OCR解决方案:如何用Umi-OCR离线批量识别图片文字
  • Windows上直接安装Android应用的终极解决方案:APK Installer使用全指南
  • 163MusicLyrics:一键获取全网音乐歌词的终极解决方案
  • 5个理由告诉你为什么TouchGAL是Galgame爱好者的终极选择
  • 使用curl命令在无图形界面虚拟机中测试Taotoken API连通性
  • 百度文库助手:三步解锁文档自由,让你的学习效率翻倍
  • 在nodejs后端服务中集成taotoken多模型api的实践步骤
  • 免费开源Windows清理工具:5分钟彻底解决C盘爆红问题终极指南
  • 如何免费获取八大网盘真实下载链接:网盘直链下载助手LinkSwift终极指南
  • 从ABS到EBS再到AEBS:商用车制动安全系统的“三代同堂”与技术演进史
  • 基于安卓的建筑工地人员定位系统毕业设计
  • ComfyUI-WanVideoWrapper:零基础玩转AI视频生成的三大核心优势
  • 第三十一篇技术笔记:郭大侠学UDS(22服务)- 武学泰斗藏经阁,秘籍存放讲规则
  • 如何快速掌握CyberpunkSaveEditor:终极存档编辑教程
  • 信通院:智能算力服务研究报告 2026
  • 使用Taotoken CLI工具一键配置团队开发环境中的模型接入参数
  • 5分钟解锁无线电视觉魔法:SSTV解码工具Robot36全攻略
  • FeHelper:前端开发者的效率神器,30+工具集成与实战技巧
  • 使用 curl 命令直接测试 Taotoken 提供的各种大模型效果
  • 为什么92%的Java医疗系统卡在等保四级终评?(基于37家三甲医院改造失败案例的数据复盘)
  • 3分钟完成Fedora启动盘制作:跨平台U盘写入终极指南
  • 深入浅出:Highcharts 中的yAxis 选项更新
  • 2026北京车展智驾/座舱域控方案大盘点(25家)
  • 当数字记忆被平台锁死:如何用开源工具为B站缓存视频赋予永恒生命?
  • Chrome-QRCode:构建浏览器端二维码生成与解码的完整技术方案
  • 从“能用”到“好用”:LNMP环境调优实战,让你的WordPress网站快如闪电
  • 【Java 25 FFM生产红线警告】:这7类Segmentation Fault错误90%开发者仍在硬扛,附GDB+JFR联合诊断流程图
  • 保姆级教程:在GAMIT 10.75中手动开启北斗三号B1C/B2a新频点解算(附源码修改步骤)