# 一、错误排查

遇到情况:lsusb有信息,ls /dev/tty* 没信息
插拔usb设备,查看信息

sudo dmesg | tail -n 30

初步确认jetson orin nano jetpack版本6.2(linux内核5.15.148)可能没有ch341驱动
查看内核版本信息(内核版本一定要匹配!)

uname -r

# 二、装驱动

具体参考:https://keaa.net/linux-ch34x-driver.html#:~:text=在官方Linux内核版本中自Kernel2.6以后就默认包含了对CH340%2FCH341芯片的驱动支持,并且能成功识别驱动。,用串口软件正常打开串口却无法收发,其实是芯片官方更新芯片版本,这时候只需要用芯片官网提供的新驱动进行替换即可使用。
驱动下载地址:https://www.wch.cn/downloads/category/67.html
Open: image-20251109180411587.png

解压后确认路径(不能有中文名,不能有(1)这种字符)

unzip CH341SER_LINUX.ZIP
cd CH341SER_LINUX
make
sudo make load

显示 insmod ch34x.ko则装成功,但这样重启驱动还是会丢,每次make load非常繁琐,故要设置开机自动加载驱动
把34x改成对应版本,这里是341

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

# 依赖冲突

再次运行

sudo dmesg | tail -n 30

发现显示

new full-speed USB device number 10 using tegra-xusb 
[ 1511.403647] usb_ch341 1-2.4:1.0: ttyCH341USB0: ch341 USB device 
[ 1511.492491] usb 1-2.4: usbfs: interface 0 claimed by usb_ch341 while 'brltty' sets config #1 
[ 1511.493807] usb_ch341 1-2.4:1.0: ch341 usb device disconnect.

和brltty冲突了,遂查brltty是什么服务(盲人屏幕阅读器,用不到这个服务,故停止服务并删除)
参考博客:https://blog.csdn.net/weixin_49203415/article/details/136319128

sudo systemctl stop brltty
sudo systemctl disable brltty
sudo apt remove brltty

支持,ls /dev/tty* 显示ttyCH341USB!
..但是串口依旧无法访问
测试发现给读写权限后有用,故有下步

sudo chmod 666 /dev/ttyCH341USB0

# 设置权限

1.先查内容(CH341 的厂商 ID 和产品 ID 可以用 lsusb 查看,比如你的是 1a86:7523

lsusb
sudo nano /etc/udev/rules.d/99-ch341.rules

2.添加内容

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666"

3.保存后,重新加载udev规则

sudo udevadm control --reload-rules
sudo udevadm trigger

4.再插拔设备后,你就可以直接用普通用户访问了。

# 驱动测试程序

#!/usr/bin/env python3
import serial
import time

# 串口配置
PORT = '/dev/ttyCH341USB0'  # 你的 CH341 串口设备
BAUDRATE = 115200

try:
    ser = serial.Serial(PORT, BAUDRATE, timeout=0.1)
    print(f"串口已打开: {PORT} @ {BAUDRATE} baud")
except Exception as e:
    print(f"打开串口失败: {e}")
    exit(1)

def read_serial():
    while True:
        try:
            if ser.in_waiting:
                data = ser.readline().decode('utf-8', errors='ignore').strip()
                if data:
                    print(f"接收: {data}")
        except Exception as e:
            print(f"读取串口出错: {e}")

def send_serial(msg: str):
    try:
        ser.write((msg + '\n').encode('utf-8'))
        print(f"发送: {msg}")
    except Exception as e:
        print(f"发送串口出错: {e}")

if __name__ == "__main__":
    import threading

    # 启动接收线程
    t = threading.Thread(target=read_serial, daemon=True)
    t.start()

    print("输入要发送的消息,按 Ctrl+C 退出")
    try:
        while True:
            s = input("> ")
            if s:
                send_serial(s)
    except KeyboardInterrupt:
        print("退出程序")
        ser.close()