三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

告别‘设备未识别’:Ubuntu 20.04下CH340驱动编译安装保姆级避坑指南

告别‘设备未识别’:Ubuntu 20.04下CH340驱动编译安装保姆级避坑指南

告别‘设备未识别’:Ubuntu 20.04下CH340驱动编译安装保姆级避坑指南

在嵌入式开发和物联网项目中,CH340芯片因其低成本和高兼容性成为串口通信的常见选择。然而许多Ubuntu用户在连接CH340设备时,常会遇到系统无法识别的尴尬局面——设备管理器一片空白,调试工具找不到端口,项目进度被迫中断。这种情况往往源于Ubuntu系统自带的CH340驱动版本过旧,无法适配新版内核或特定硬件变种。

本文将彻底解决这一痛点,不仅提供完整的驱动安装流程,更聚焦于实际开发中可能遇到的各类"坑点":从内核版本冲突、编译依赖缺失,到权限问题和模块加载失败。无论你是刚接触Ubuntu的物联网爱好者,还是需要快速解决问题的专业开发者,都能从中获得可直接落地的解决方案。

1. 环境准备与问题诊断

1.1 检查现有驱动状态

首先确认系统是否已经加载了CH340驱动模块。打开终端执行:

lsmod | grep ch34

如果没有任何输出,说明驱动未加载。接着检查驱动文件是否存在:

ls /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch34*

常见情况是系统自带的ch341.ko文件版本过旧(通常发布于几年前),无法适配新版硬件。此时需要先移除旧驱动:

sudo rm /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko

注意:删除系统文件需要管理员权限,操作前建议备份原驱动文件

1.2 确认内核头文件与编译工具

编译驱动需要匹配当前内核版本的头文件和编译工具链。检查并安装必要组件:

sudo apt update sudo apt install linux-headers-$(uname -r) build-essential make gcc

验证工具链是否完整:

gcc --version make --version

如果遇到"Unable to locate package"错误,可能是内核头文件版本不匹配。使用apt-cache search linux-headers查看可用版本,确保与uname -r输出一致。

2. 驱动源码获取与适配

2.1 下载最新官方驱动

从南京沁恒官网获取最新Linux驱动(截至2023年最新版本为1.5):

wget http://www.wch.cn/downloads/CH341SER_LINUX_ZIP.html unzip CH341SER_LINUX.ZIP

解压后得到以下关键文件:

  • Makefile:编译配置文件
  • ch34x.c:驱动核心源码
  • readme.txt:版本说明文档

2.2 内核版本适配技巧

不同Linux内核版本对USB串口驱动的API可能有细微调整。如果直接编译报错,需要手动适配:

  1. 查询当前内核版本:

    uname -r
  2. 在 Bootlin Elixir 网站搜索对应内核版本的ch341.c源码

  3. 比较官方驱动与内核源码的差异,重点关注:

    • usb_serial_driver结构体定义
    • probe/disconnect回调函数
    • 读写操作接口

典型适配案例:在5.11+内核中需要将port->write_urb替换为usb_serial_port_poison_urbs

3. 编译与安装全流程

3.1 编译过程详解

进入解压目录执行编译:

cd CH341SER_LINUX make

成功编译会生成ch34x.ko文件。常见错误及解决方案:

错误类型可能原因解决方法
implicit declaration内核API变更添加缺失的头文件或更新函数调用
unknown type结构体定义变化参照内核源码调整类型声明
Permission denied权限不足使用sudo或检查目录权限

3.2 驱动安装与验证

将编译好的驱动复制到系统目录:

sudo cp ch34x.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial

更新模块依赖关系:

sudo depmod -a

加载驱动模块并验证:

sudo modprobe ch34x lsmod | grep ch34

如果模块未显示,尝试强制加载:

sudo insmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch34x.ko dmesg | tail -n 20 # 查看内核日志排查问题

4. 串口工具配置与实战调试

4.1 串口权限配置

Ubuntu默认情况下普通用户无法直接访问串口设备,需要添加用户组权限:

sudo usermod -aG dialout $USER sudo chmod 666 /dev/ttyUSB0

永久生效需要创建udev规则:

echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666"' | sudo tee /etc/udev/rules.d/99-ch34x.rules sudo udevadm control --reload-rules

4.2 调试工具选型与使用

推荐三款常用串口工具及其特点:

  1. CuteCom(图形界面)

    sudo apt install cutecom cutecom
    • 优点:直观易用
    • 缺点:长时间传输可能丢包
  2. Minicom(终端界面)

    sudo apt install minicom minicom -D /dev/ttyUSB0
    • 优点:稳定可靠
    • 缺点:配置稍复杂
  3. Screen(轻量级方案)

    screen /dev/ttyUSB0 115200
    • 快速测试的极简方案

4.3 典型问题排查指南

当设备仍然无法识别时,按以下步骤排查:

  1. 检查物理连接:

    lsusb | grep 1a86

    应显示"QinHeng Electronics CH340 serial converter"

  2. 查看内核消息:

    dmesg | grep ch34

    观察是否有加载错误或权限问题

  3. 验证驱动版本:

    modinfo ch34x

    确认version字段与官网一致

  4. 测试不同波特率:

    • 某些CH340变种需要特定波特率才能稳定工作

在最近的一个物联网网关项目中,我们发现某些国产CH340模块需要额外添加复位信号处理代码才能稳定工作。这提醒我们,当标准方案失效时,可能需要针对特定硬件进行驱动定制。

← 返回列表