尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Nvidia Jetson上CH340驱动安装全攻略:从原理到实操

Nvidia Jetson上CH340驱动安装全攻略:从原理到实操 过去这几年折腾了不少Nvidia Jetson系列的板子从最早的Jetson TK1到后来的TX2、Nano、Xavier NX中间绕了不少弯路。最让我印象深刻的不是模型推理性能调优反而是最不起眼的一个小问题——给Jetson接USB转串口模块时CH340驱动装不上、装好了又掉线、掉线了还乱码。很多刚入门的朋友拿着Jetson Nano官方镜像兴冲冲地把CH340插上去结果ls /dev/ttyUSB*什么都没有一脸懵。这篇东西我就把Jetson上安装CH340串口驱动的完整经验写清楚包括原理、apt安装、源码编译、权限配置以及我踩过的那些坑。适合刚拿到Jetson开发板、准备用串口调试单片机或传感器模块的嵌入式开发者也适合那些在Linux下对USB转串口设备一头雾水的朋友。搞明白CH340这颗芯片的脾气之后你以后在Ubuntu、Debian甚至CentOS上遇到类似问题都能举一反三。1. 先弄明白CH340在Jetson开发里扮演什么角色1.1 CH340芯片与USB转串口的基本原理CH340是南京沁恒出品的一款USB转串口芯片价格便宜、外围电路简单所以大量低成本开发板、GPS模块、单片机下载器、3D打印机主板上都能看到它的身影。它的核心作用就是把USB总线的数据包转换成UART的TX/RX电平信号让电脑或开发板通过USB口去跟一个只有串口接口的设备通信。Jetson系列本身带有UART引脚比如Jetson Nano的40Pin排针上就有UART0和UART1但大部分时候我们不想占用那些引脚或者设备离板子比较远、需要更稳定的连接这时候USB转串口就派上用场了。你把CH340模块插到Jetson的USB口上系统通过驱动把它识别成一个串口设备之后你用screen、minicom或Python serial去操作这个设备节点就像操作板载串口一样。从驱动层面讲Linux内核里其实已经包含了一个名为ch341的驱动模块注意这里的名字是ch341不是ch340。这个模块覆盖了CH340和CH341等芯片但内核自带版本的功能比较基础。在Jetson的Ubuntu系统上能不能自动加载这个模块取决于内核配置和是否安装了linux-modules-extra包。这也是后来很多人发现“明明芯片没问题但系统就是没反应”的根本原因。1.2 为什么Jetson需要单独装驱动很多从Arduino或树莓派转过来的朋友会觉得很奇怪树莓派插上CH340就能用为什么Jetson就这么麻烦这里面有几个原因。第一Jetson的Ubuntu镜像是Nvidia基于Ubuntu定制的主要目标是AI推理和GPU计算对大量桌面级外设的支持没有做完整裁剪。默认镜像里可能带了ch341模块但/lib/modules/$(uname -r)/kernel/drivers/usb/serial/目录下只有部分驱动像ftdi_sio、pl2303这类常见芯片驱动通常没问题但CH340依赖的ch341.ko有可能不在默认安装列表里。第二Jetson的内核是Nvidia修改过的L4T内核Linux for Tegra跟桌面版Ubuntu的内核不完全一样。有时候你在网上搜到“执行sudo apt install linux-modules-extra-$(uname -r)”就能解决但到了Jetson上这个包名可能不存在或者装上了但模块路径跟预期不同。第三很多新版Jetson镜像比如JetPack 5.x以上默认使用的是内核5.10或更高版本从内核4.16开始ch341驱动已经从原来的drivers/usb/serial/ch341.c迁移并重构过行为也有变化。如果你拿旧教程去操作很容易对不上号。所以搞清楚自己板子上的系统版本、内核版本和模块情况比盲目敲命令重要得多。1.3 常见板卡与串口芯片的对应关系在开始安装之前先花30秒认清你手里的东西。市面上USB转串口模块常用的芯片方案主要有这几类芯片型号常见品牌/模块Linux驱动Jetson默认支持情况CH340/CH341蓝板绿板CH340模块、部分Arduino Nano克隆版ch341.ko视镜像而定可能需要额外安装CP2102/CP2104黑壳USB转TTL、很多飞控调试线cp210x.ko多数镜像已包含FT232R/FTDIFTDI原厂模块、工业调试工具ftdi_sio.ko基本都支持PL2303老式USB转串口线pl2303.ko基本都支持我在Jetson Nano上测试过默认JetPack 4.6镜像里cp210x和ftdi_sio是直接就有的插上就能看到/dev/ttyUSB0。但CH340不一定有的镜像版本里ch341.ko存在有的压根没编进去。所以你先判断自己的芯片类型别一上来就对着CH340教程猛敲命令。判断方法很简单把模块插到电脑或Jetson上执行lsusb看输出里的芯片厂商ID。CH340通常是1a86:7523CP2102是10c4:ea60FT232是0403:6001。看到ID之后你搜问题都能精准很多。2. 环境准备与硬件确认2.1 Jetson官方镜像刷写注意事项既然核心是“Nvidia Jetson CH340 驱动安装”那环境肯定是Jetson设备最常见的还是Nano。刷写官方镜像时有一个细节值得注意不要只下载一个.img文件然后随手用Win32DiskImager往SD卡里写强烈建议用Nvidia官方的SDK Manager或者直接下载Jetson Nano镜像压缩包后用Etcher写入。官方的.img文件里包含了bootloader和内核模块用SDK Manager刷写还会自动处理分区和驱动能少踩很多坑。如果你手里已经是刷好的系统先确认一下Ubuntu版本和内核版本。打开终端执行lsb_release -a uname -r正常情况下JetPack 4.6对应Ubuntu 18.04内核4.9JetPack 5.x对应Ubuntu 20.04内核5.10。知道你内核版本之后后续找模块路径、装linux-modules-extra就有针对性了。2.2 硬件连接与系统识别确认这一步看起来简单但最容易出问题。CH340模块一般有四个引脚VCC、GND、TX、RX。跟Jetson的USB口连接时只需要插USB口不用管杜邦线那头。很多人第一步就栽了把CH340模块插到Jetson的USB口上然后杜邦线另一头接了某个单片机单片机没上电整个回路没共地CH340模块当然不工作。我做调试时习惯先把CH340模块单独插到Jetson USB口什么都不接先确认系统能不能识别这个USB设备。插上去之后等一两秒执行lsusb如果你看到1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter这样的输出恭喜你硬件至少被USB层识别了。这时候再看内核有没有给这个设备绑定驱动dmesg | tail -20这里输出的信息量很大。如果看到usb 1-1: ch341-uart converter now attached to ttyUSB0说明驱动已经加载/dev/ttyUSB0应该已经出现如果只看到usb 1-1: new full-speed USB device number 2 using tegra-xusb这类信息但没有ch341-uart converter字样说明系统识别到了USB设备但没有对应的驱动来接管它。2.3 先查内核模块再动手在没有/dev/ttyUSB0的情况下不要急着去下载乱七八糟的驱动包先查内核模块是否存在于当前系统中find /lib/modules/$(uname -r) -name *ch341* modinfo ch341modinfo如果能返回模块描述、作者、license这些信息说明模块文件存在只是没有被自动加载。手动加载一下sudo modprobe ch341然后重新插拔CH340再看dmesg和ls /dev/ttyUSB*。如果modinfo提示找不到模块那就说明当前内核里就没有这个模块这时候才需要走安装路线。在Jetson上还有个特殊地方L4T内核的模块路径可能带kernel/drivers/usb/serial/但模块依赖的usbserial.ko是否被加载也会影响最终结果。可以一起查看lsmod | grep usbserial如果usbserial没加载就算ch341加载了也可能报依赖错误。手动加载时先modprobe usbserial再modprobe ch341顺序对了问题能少一半。3. 驱动安装apt 与源码编译两条路线3.1 方法一apt安装linux-modules-extra快速搞定在Ubuntu桌面系统上CH340驱动包含在linux-modules-extra-$(uname -r)包里。在Jetson上这个包在部分镜像里可以直接通过apt安装。操作如下sudo apt update sudo apt install linux-modules-extra-$(uname -r)执行完之后重新加载模块sudo modprobe ch341 sudo modprobe usbserial然后再插拔CH340模块检查dmesg输出。但这里有个前提你的Jetson镜像源里得有对应内核版本的包。Jetson的apt源跟普通Ubuntu源不太一样很多定制包的版本号是Nvidia自己的编号。如果执行apt安装时提示Unable to locate package说明这个包在Nvidia的源里不存在或不叫这个名字。这时候别硬刚直接走源码编译路线或者先尝试sudo apt search ch341看看有没有相关的包。我个人的建议是如果你用的是JetPack 5.x先尝试apt如果是老版本JetPack 4.x大概率得手动搞。不管哪种方式装完都一定要执行一次modprobe ch341确认模块能正常加载而不是装完就算完事。3.2 方法二源码编译CH34x驱动当apt路线走不通时源码编译是靠谱的选择。市面上常见的CH340 Linux驱动源码有两个来源一个是最初的ch341内核模块版本另一个是沁恒官方提供的CH341SER_LINUX驱动包通常是一个.tar.gz压缩包。我自己更推荐直接从内核源码树里提取ch341.c来编译或者使用Github上维护较好的项目。不过对初学者来说沁恒官方包更直观解压之后里面有个ch34x.c文件和Makefile编译流程很清晰。具体步骤wget https://www.wch.cn/downloads/CH341SER_LINUX_ZIP.html # 实际下载后用unzip解压得到CH341SER_LINUX目录 cd CH341SER_LINUX make sudo make installmake install默认会把生成的ch34x.ko复制到/lib/modules/$(uname -r)/kernel/drivers/usb/serial/下然后执行depmod更新模块依赖。装完之后sudo modprobe ch34x这里想提醒一点沁恒官方包的模块名是ch34x不是内核自带的ch341。如果你之前加载过ch341模块两个模块同时存在时可能会互相干扰。稳妥做法是先卸载sudo modprobe -r ch341 sudo modprobe ch34x我在Jetson Nano上编译时遇到过一个问题源码Makefile默认用的交叉编译工具链是gcc在Jetson本机上编译没问题但你如果是用PC交叉编译还要配置CROSS_COMPILE很麻烦。建议直接在Jetson板子上执行编译不要交叉编译省心很多。编译前确保有build-essentialsudo apt install build-essential如果你的内核头文件没装也会编译失败。Jetson官方镜像一般带/usr/src/linux-headers-$(uname -r)如果没有能用apt装就装不能的话估计得手动下载对应L4T包。我在个别镜像上遇到过/usr/src下空荡荡的情况这时候源码编译这条路会很痛苦建议退回方法一或确认镜像完整性。3.3 udev规则与权限配置避免每次sudo驱动装好、设备节点出现之后还有一个很实际的问题普通用户访问/dev/ttyUSB0需要权限。默认情况下这个节点属于dialout组。如果你不想每次都sudo把当前用户加入dialout组sudo usermod -a -G dialout $USER然后重新登录或者执行newgrp dialout让它生效。除此之外如果你有多个USB转串口设备插拔顺序一变设备节点可能从ttyUSB0变成ttyUSB1程序里写死的端口就失效了。这时可以通过udev规则固定设备名。在/etc/udev/rules.d/下新建一个99-ch340.rulesSUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyCH340保存后执行sudo udevadm control --reload-rules sudo udevadm trigger之后不管插在哪个USB口设备都会以/dev/ttyCH340这个名字出现。这个技巧在做多设备调试时特别有用我后来做机器人底盘加GPS模块时就是靠这招区分开两个串口设备的。4. 实测中的高频问题与排查记录4.1 插上完全没反应可能不是驱动问题CH340模块插上后lsusb都没有设备这种情况基本跟驱动没关系而是硬件链路的问题。我遇到过好几种情况USB线只有充电功能没有数据线。很多廉价USB线内部只接了电源线数据线D/D-根本没有插上之后电源指示灯亮但系统完全识别不到设备。判断方法很粗暴用这根线连接手机和电脑看电脑能否识别到手机存储。CH340模块本身虚焊或芯片是假的。市面上假CH340芯片很多有的打磨后丝印模糊有的芯片内部型号实际是CH341但被商家当CH340卖行为兼容性有差异。真正的原厂CH340在Linux下工作很稳假货则可能出现识别不稳定、掉线等情况。我有个模块插在电脑上正常插到Jetson上就“消失”后来换了个模块问题就解决了。Jetson的USB口供电不足。特别用的是不带独立电源的Jetson Nano或者用的是劣质5V电源USB口电压跌落严重CH340模块启动到一半就挂了。这种情况你会在dmesg里看到一堆reset high-speed USB device之类的报错。解决办法是给Jetson用稳定电源或者用带供电的USB Hub。4.2 有lsusb设备但/dev/ttyUSB0不出现怎么办这是最典型的“驱动未加载”场景。lsusb能看到1a86:7523说明USB枚举层面没问题内核也已经识别到这是一个串口设备类的USB设备但没有驱动去接管它所以不会创建ttyUSB0。排查步骤按顺序来# 1. 查看当前内核是否认识这个设备 sudo dmesg | grep -i ch34 # 2. 查看usbserial模块是否加载 lsmod | grep usbserial # 3. 手动加载ch341 sudo modprobe ch341如果你执行modprobe ch341时提示modprobe: FATAL: Module ch341 not found in directory /lib/modules/...那就回到第3节要么apt装linux-modules-extra要么源码编译。还有一种情况模块加载了但dmesg显示device disconnected。这通常是插拔太快或者USB接触不良重新插拔一次基本能解决。还有极少数情况是ch341与ch34x两个模块都加载了互相争抢设备卸载掉一个就好。4.3 掉线、乱码、波特率不稳的排查思路设备节点出来了但用screen /dev/ttyUSB0 115200连上之后要么秒退要么收到一堆乱码要么用几分钟就掉线。这里面有几个层次的原因。硬件层面CH340模块的TX/RX电平不匹配。Jetson的UART是3.3V电平如果你的CH340模块是5V版本、且没有电平转换电路直接连接可能会造成信号异常表现为能通但数据不稳定。解决方法是确认模块是3.3V/5V兼容或者加电平转换板。我在调试STM32时习惯用3.3V跳线供电最大限度避免电平冲突。软件层面首先是波特率不匹配。通信双方必须设置相同的波特率这个看似常识但有的人会用默认的9600去连115200的设备自然乱码。还有个容易忽视的点串口通信的奇偶校验位、数据位、停止位也要一致。用minicom -s进入配置界面检查一下参数。掉线问题还需要看是不是ch341驱动的已知bug。Linux内核里的ch341驱动在很久以前有过一个跟termios设置相关的bug在某些波特率下会产生大量帧错误表现就是数据断断续续。如果你用的是高版本内核这个问题基本已经被修复如果用的是老内核可以考虑升级JetPack或者使用外部ch34x驱动。另外USB转串口在传输大数据量时掉线很可能是缓冲区溢出。CH340内置缓冲区不算大如果上位机不及时读取数据内核缓冲区满了就会丢包、掉线。解决办法是在应用程序里设置合理的read超时或者使用serial库时增大read_buffer_size。4.4 Windows 11下CH340不能用的兼容坑虽然这篇博文主要讲Jetson但很多人调试时是先用Windows确认模块好坏再插到Jetson上的。Windows 11下CH340不能用的情况这几年特别多主要原因是Windows 11的驱动签名机制变化老版本的CH340驱动没有通过微软签名认证系统直接拒绝加载。网上搜“windows 11 ch340 不能使用”能搜出一堆人问同样问题。实际上沁恒官方在2023年之后发布了新版驱动专门适配Windows 11下载安装然后在设备管理器里看到“USB-SERIAL CH340”且没有黄色感叹号基本就好了。还有一个更省事的办法Windows 11系统更新有时候会自动推送兼容驱动你在设备管理器里右键设备选择“更新驱动程序”然后“自动搜索”有一定概率能装上。如果更新驱动后还是不行去设备管理器里把设备卸载勾选“删除此设备的驱动程序软件”然后重新插拔让系统重新识别。我见过不少次旧驱动残留导致新驱动装不上的情况。5. 从CH340到其他常用调试器驱动安装与选型参考5.1 FT232R、CP2102与CH340怎么选既然聊到串口驱动干脆把常见的几种芯片也说说方便你以后选型。FT232R是FTDI公司老牌产品驱动支持最好Linux内核自带ftdi_sioWindows驱动也是官方持续维护。它最大的优点是稳定性缺点是贵原厂模块一个几十块国内山寨版多假货识别困难。CP2102是Silicon Labs的产品同样被内核原生支持模块价格适中做工通常比廉价CH340模块规整。它的一个问题是最新版驱动在Windows下偶尔会被识别为COM端口号特别大但Linux下几乎没毛病。如果你做产品原型用CP2102会是省心选择。CH340的优势就是便宜模块几块钱包邮功能上完全够用。缺点是电气性能和驱动兼容性不如前两者。但在Jetson这类Linux设备上只要驱动装对CH340实际使用起来并没有什么问题。我自己在项目里大量使用CH340关键是选靠谱的模块、避免虚焊。特性CH340/CH341CP2102FT232R价格最低中等较高Linux内核驱动ch341.ko部分镜像缺失cp210x.ko基本都有ftdi_sio.ko基本都有稳定性中高高推荐场景学习调试、低成本项目产品原型、工业调试严谨工程、跨平台开发5.2 STLink、JLink驱动的安装差异串口周边还经常会出现STLink和JLink驱动安装问题。STLink是ST意法半导体的调试器主要给STM32用JLink是Segger出的支持ARM全系列价格比较高。这些调试器接到Jetson上情况跟CH340类似也有区别。STLink在Linux下需要安装libusb和stlink-toolssudo apt install stlink-tools然后用st-info --probe确认连接。JLink则需要在Segger官网下载Linux版驱动包解压后运行install.sh再把设备接到USB上用JLinkExe验证。之所以把这两个也拉进来对比是因为它们的驱动安装思路跟CH340有共通之处Linux下大多数USB设备都遵循“内核识别USB设备 - 绑定驱动 - 创建访问接口”这条路。STLink和JLink有自己的USB vendor ID只要系统里装了对应的udev规则和用户态工具就能正常工作。不像CH340那样需要内核模块这两个调试器更多依赖用户态驱动和权限配置。如果你在Jetson上装STLink或JLink驱动遇到问题优先检查权限Segger的安装脚本通常会配置好udev规则但如果你忘记执行或者规则冲突设备会被系统识别但无法open。这时候查看/etc/udev/rules.d/下有没有对应的规则文件没有就手动添加。5.3 个人建议的串口调试工具链搭配几年折腾下来我手边常用的串口调试工具链是一个CH340模块作为通用串口调试一个CP2102模块用于需要高稳定性的连接比如GPS模块长时间数据记录一个FT232原厂模块用于跟工业设备对接。每个模块都配好udev规则设备名分别固定为ttyCH340、ttyCP2102、ttyFT232插上就知道是谁。软件方面在Jetson上我一般用minicom做快速测试用Python的pyserial写自动化脚本用cutecom做图形化调试。如果你需要看波形开源工具sigrok配合逻辑分析仪也很有用。这些工具在Jetson的Ubuntu源里都能直接装sudo apt install minicom cutecom python3-serial安装CH340驱动本身从来不是高深技术但它很能反映Linux系统工作的一般逻辑设备枚举、驱动匹配、模块加载、设备节点、权限控制一环扣一环。你在Jetson上把这个流程走通一遍以后排查其他USB设备的问题就有章可循了。最后分享一个我自己的小习惯每次拿到新的Jetson镜像第一件事就是插上CH340跑一遍dmesg确认ch341模块是否在镜像里。如果不在我会先记录下来等系统更新后再查一次。这样既保证了随时能串口调试也避免了某次急用时才发现连模块都用不了的尴尬。Nvidia Jetson系列作为边缘计算的主力平台性能虽然重要但这些小外设的稳定性才是决定开发体验的关键。串口调试是一切嵌入式开发的基础把这根“毛细血管”打通你后续玩单片机、接传感器、调机器人都会顺畅很多。
返回列表