以前搞过一次这个,但是时间长了又忘了。
今天用ch340在linux下调试,用以前写好的串口调试程序不能发送数据了。只记得window下需要安装驱动,实际linux下也需要驱动才能正常使用。默认linux是有这一驱动的,但是有些老旧,不能用。
今天的调试过程中,首先把ch340 一端插入电脑
输入命令: lsmod | grep usbserial
输出:usbserial 53248 1 ch341
成功发现了设备,识别出时 ch341 是我记错了??
输入:lsusb
输出一下信息:
Bus 002 Device 003: ID 17ef:4810 Lenovo Integrated Webcam [R5U877]
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 002: ID 1a81:1004 Holtek Semiconductor, Inc.
Bus 006 Device 003: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
发现了ch341的一些相关信息
输入命令(查看USB转串口接入状态):dmesg
输出相关信息,部分信息如下:
[ 429.184170] usb 6-1: new full-speed USB device number 3 using uhci_hcd
[ 429.345937] usb 6-1: New USB device found, idVendor=1a86, idProduct=7523
[ 429.345944] usb 6-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 429.345948] usb 6-1: Product: USB2.0-Ser!
[ 429.368123] usbcore: registered new interface driver usbserial
[ 429.368396] usbcore: registered new interface driver usbserial_generic
[ 429.368875] usbserial: USB Serial support registered for generic
[ 429.374125] usbcore: registered new interface driver ch341
[ 429.374143] usbserial: USB Serial support registered for ch341-uart
[ 429.374165] ch341 6-1:1.0: ch341-uart converter detected
[ 429.386851] usb 6-1: ch341-uart converter now attached to ttyUSB0
ID信息与lsusb检测到的一致,ch341-uart converter now attached to ttyUSB0 成功驱动,端口为ttyUSB0。
再此,确实能看到自带了驱动,但不要高兴太早。接着往下来
第二步:安装串口终端软件,搜到了一个minicom,动手试试:
首先:建议刷新一下源sudo apt-get update
然后安装:sudo apt-get install minicom
打印一些信息,输入‘y’。
等待安装成功,然后用sudo minicom -s 设置minicom的端口对应到ttyUSB0(对应使用dmesg命令看到的信息)。
出现配置菜单:
选择“Serial port setup”,出现串口配置菜单:
输入A,修改serial device 由/Dev/tty0修改为/dev/ttyusb0,波特率按实际硬件参数情况修改,我的修改为115200 8N1,也有19200 8N1的硬件等。
然后返回
选择 Save setup as dfl
接着选择Exit退出。
可以再进一次sudo minicom -s,看看参数是否保存好。
此时,使用串口调试工具,能看到ttyUSB0,但还是无法进行通信。
运行dmesg,显示如下
这个原因是,驱动版本太老旧,需要重装驱动
1.首先去官网下载最新的驱动,参见某高人的博客:CH340各平台下驱动
2.下载下来linux版本的驱动
将其拷贝到Linux系统中,在使用之前首先需要将老驱动删除掉,这样才能防止即使安装了新驱动老驱动仍然生效。系统的默认驱动目录为:/lib/modules/$(uname -r)/kernel/drivers,老驱动的完整路径名:/lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko,我们进入到该目录下,然后将其删除掉,如下所示:
3.解压新驱动并进行编译安装,具体流程如下图。
实际上操作起来就是四步:
-
[email protected]:/#unzip CH341SER_LINUX.ZIP
-
[email protected]:/#cd CH341SER_LINUX
-
[email protected]:/#make
-
[email protected]:/#make load
其中尤其要注意第三步 make 之后的执行过程和结果,如果没有顺利生成 ch34x.ko 那么就需要查看提示的报错原因了,然后进行相应问题的查找或者咨询 [email protected]。在make load后插入 CH340 硬件,输入命令:dmesg 查看系统日志信息,如下图所示:
如果成功会出现上图所示的信息,并且产生的设备节点名称为 ttyUSB0,我们可以到 /dev 目录下进行查看,会发现设备文件 /dev/ttyUSB0,然后剩下的操作就类似于 Windows 系统操作 COM 口一样简单了。
4.如果第3步的make出现错误,error: unknown type name ‘wait_queue_t’和implicit declaration of function ‘signal_pending’ [-Werror=implicit-function-declaration]的错误提示。
即编译官方的ch34x驱动源码时,出现:
1.error: unknown type name ‘wait_queue_t’;
2.implicit declaration of function ‘signal_pending’ [-Werror=implicit-function-declaration]
的错误提示。
需要进行如下解决:
需要使用vi编辑器,wait_queue_t 没有被使用过,查找wait_queue_t(/wait_queue_t 定向找到它,只有一行),所以直接在源码中注释掉即可。
2引入头文件#include <linux/sched/signal.h>。
然后问题就解决了,可以直接编译 使用make 然后make load,加载到系统驱动中。
至此,串口终于可以通信了。
如果希望每次开机之后系统可以自动加载驱动的话,也很简单只需要两步,把生成的 ch34x.ko 文件拷贝到原先老驱动的目录下,然后执行 depmod 命令就可以了,如果不够明确可以参考博客:Linux系统开机自动加载驱动module
原文地址:https://www.cnblogs.com/feiyufu/p/9302367.html