目录

查询内置驱动:

切换到 ch341.ko文件所在目录:

执行删除 ch341.ko命令:

下载CH341驱动:

查询操作系统的发行编号 :

替换ch341.c文件里的内容:

编译源程序:

复制ch341.ko文件

输入lsmod命令查看:

ch341驱动安装失败:

执行sudo depmod -a:

然后再次输入lsmod命令查看:

切换到driver文件目录下:

载入模块(设备驱动程序)

查看驱动签名情况:

驱动签名:

载入模块(设备驱动程序)

输入lsmod命令查看:

参考文章:

安装串口调试工具cutecom:(也可以安装COMTool)

运行cutecom:

插入串口模块USB转TTL:

 常见问题:

参考文章:

基于python的串口通信测试代码(linux):

 注意:


ubuntu安装CH341串口驱动:

自Linux内核版本2.6.24其,主线内核已内置ch341串行驱动程序。其位置为:drivers/usb/ serial/ ch341.c,系统自带的版本比较老,所以要删除掉,重新安装驱动。


查询内置驱动:

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

可以看到内置的旧串口驱动ch341.ko文件,将旧串口驱动ch341.ko文件删除。


切换到 ch341.ko文件所在目录:

cd /lib/modules/$(uname -r)/kernel/drivers/usb/serial

执行删除 ch341.ko命令:

sudo rm -rf ch341.ko

下载CH341驱动:

https://www.wch.cn/download/CH341SER_LINUX_ZIP.html

解压过后在driver里有三个文件

     


查询操作系统的发行编号 :

uname -r


替换ch341.c文件里的内容:

根据发行编号,查询相对应的ch341.c文件(我的版本号是6.5.0-27)

https://elixir.bootlin.com/linux/v6.5/source/drivers/usb/serial/ch341.c

 将对应的ch341.c文件内容复制到driver文件里的ch341.c文件里,进行内容替换。


注意要安装gcc与make

编译源程序:

切换到driver文件夹目录下,进行make编译源码,生成ch341.ko文件

//这是我的驱动所在目录,你可以根据自己驱动所在目录更改命令
cd /home/ubuntu/Downloads/qudong/CH341SER_LINUX/driver

进行make编译源码

//注意要按照gcc和make
make

make编译后,会在driver文件夹内生成ch341.ko文件。


复制ch341.ko文件

复制ch341.ko文件至系统默认驱动文件夹

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

查看系统默认驱动文件夹内的驱动:

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

 查看新安装的ch341.ko 驱动


输入lsmod命令查看:

lsmod | grep ch

如果有ch341模块,则驱动安装完成,串口驱动安装到此结束。


ch341驱动安装失败:

执行sudo depmod -a:

如果输入lsmod命令查看,未发现ch341模块,则可以执行sudo depmod -a命令,然后重启一次电脑。

sudo depmod -a

然后再次输入lsmod命令查看:

lsmod | grep ch


如果上述方法无效:

切换到driver文件目录下:

//这是我的驱动所在目录,你可以根据自己驱动所在目录更改命令
cd /home/ubuntu/Downloads/qudong/CH341SER_LINUX/driver

载入模块(设备驱动程序)

sudo make load

如果sudo make load这一步出现以下错误:

ERROR: could not insert module ch341.ko: Key was rejected by service

则说明.ko文件需要签名


查看驱动签名情况:

ls

 driver文件目录下

查看签名情况:

hexdump -C ch341.ko | tail

可以看到驱动没有签名


驱动签名:

驱动签名依赖mokutil和shim-signed

sudo apt install mokutil
sudo apt install shim-signed
sudo update-secureboot-policy --new-key

生成的证书(MOK.der)和私钥(MOK.priv)位于 /var/lib/shim-signed/mok/ 目录 

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der

重新启动电脑,将询问您是否要更改安全设置,选择”Yes”。输入密码,重启!

 方法一:如果重启后没有出现询问是否要更该安全设置的情况,可以再次重启一下(我是再次执行了一遍驱动签名命令后再重启的)

方法二:如果未弹出Perform MOK management界面,将生成的证书(MOK.der)和私钥(MOK.priv)删除调,再次执行驱动签名程序。

cd /var/lib/shim-signed/mok
ls

可以看到/var/lib/shim-signed/mok目录下的证书(MOK.der)和私钥(MOK.priv)

sudo rm -rf MOK.der
sudo rm -rf MOK.priv

往驱动中写入签名(重要)

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der ch341.ko 

再次查看签名情况:

hexdump -C ch341.ko | tail

此时驱动程序数据中有~Module signature appended~,已写入签名。


载入模块(设备驱动程序)

sudo make load

输入lsmod命令查看:

lsmod | grep ch

 到此完成串口驱动的安装。


参考文章:

https://blog.csdn.net/qq_50972633/article/details/132795565

https://blog.csdn.net/qq_28680277/article/details/129162559

https://blog.csdn.net/inthat/article/details/128844657


安装串口调试工具cutecom:(也可以安装COMTool

终端命令行中输入:

sudo apt-get install cutecom

出现y/n选择时输入:y 


运行cutecom:

sudo cutecom 

 出现这个界面说明cutecom安装成功


插入串口模块USB转TTL:

 查看串口名称使用:

USB转ttl串口设备命令 ls -l /dev/ttyUSB*、

普通的串口设备会命令 ls -l /dev/ttyS*,

通用命令: ls -l /dev/tty*

ls -l /dev/ttyUSB*

 插入USB转ttl串口模块会出现串口名称

拔掉USB转ttl串口模块,以此来确定准确的串口名称

ls -l /dev/ttyS*

ls -l /dev/ttyS*查询不到,usb转ttl串口设备的使用情况。

ls -l /dev/tty*

 插入USB转ttl串口模块会出现串口名称 

特殊情况:ttyUSB*被挂载为ttyCH341USB*

ls -l /dev/ttyCH*

 只是串口名称改变了,没有但是能正常进行串口通信。

所以使用串口时,一定要先确定串口的名称。


 常见问题:

 如果出现插入usb转ttl模块,而未出现ttyUSB串口名称的问题,或者是插入usb转ttl模块,cutecom检测不到ttyUSB串口

解决方法:卸载brltty,在终端使用如下命令卸载brltty

sudo apt-get remove brltty

 查看串口名称使用

ls -l /dev/tty*

 出现cutecom不能打开串口的情况:

串口是默认普通用户没有读写权限的,每次开机后对修改串口的权限:

 sudo chmod 666 /dev/ttyUSB0

也可以设置永久权限:

Ubuntu关于串口的操作(查看串口信息、串口助手、串口权限)_ubuntu 串口-CSDN博客


参考文章:

Linux下安装串口调试工具cutecom,及使用方法-CSDN博客

查看新增串口、USB设备_ubuntu查看串口设备-CSDN博客


基于python的串口通信测试代码(linux):

import serial#导入串口通信库
from time import sleep

ser = serial.Serial()

def port_open_recv():#对串口的参数进行配置
    ser.port='/dev/ttyUSB0'//串口名称
    ser.baudrate=115200//波特率
    ser.bytesize=8//数据位
    ser.stopbits=1//停止位
    ser.parity="N"#奇偶校验位
    ser.open()
    if(ser.isOpen()):
        print("串口打开成功!")
    else:
        print("串口打开失败!")
#isOpen()函数来查看串口的开闭状态



def port_close():
    ser.close()
    if(ser.isOpen()):
        print("串口关闭失败!")
    else:
        print("串口关闭成功!")

def send(send_data):
    if(ser.isOpen()):
        ser.write(send_data.encode('utf-8'))#编码
        print("发送成功",send_data)
    else:
        print("发送失败!")

if __name__ == '__main__':
    port_open_recv()
    while True:
        a=input("输入要发送的数据:")
        send(a)
        sleep(0.5)#起到一个延时的效果

 注意:

有时候会出现串口打开失败的情况:修改ttyUSB0的权限

serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: ‘/dev/ttyUSB

sudo chmod 666 /dev/ttyUSB0

 常见问题:已经安装好的CH341驱动消失,且扫描不出串口

 当你使用lsmod | grep ch查询不到已经安装的ch341驱动

lsmod | grep ch

 

 可以进入驱动文件目录(driver文件目录下)执行:

//这是我的驱动所在目录,你可以根据自己驱动所在目录更改命令
cd /home/ubuntu/Downloads/qudong/CH341SER_LINUX/driver
sudo make load

重新载入驱动,就此问题解决 

Logo

更多推荐