ubuntu安装CH341串口驱动、安装cutecom、python串口通信例程
ubuntu安装CH341串口驱动、ch341驱动安装失败、ttyUSB*被挂载为ttyCH341USB*、安装串口调试工具cutecom:(也可以安装COMTool)、基于python的串口通信测试代码(linux)、如果出现插入usb转ttl模块,而未出现ttyUSB串口名称的问题,或者是插入usb转ttl模块,cutecom检测不到ttyUSB串口、sudo make load失败进行驱动
目录
安装串口调试工具cutecom:(也可以安装COMTool)
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
重新载入驱动,就此问题解决
更多推荐
所有评论(0)