以前搞過一次這個,但是時間長了又忘了。
今天用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.解壓新驅動並進行編譯安裝,具體流程如下圖。
實際上操作起來就是四步:
-
root@ubuntu:/ #unzip CH341SER_LINUX.ZIP
-
root@ubuntu:/ #cd CH341SER_LINUX
-
root@ubuntu:/ #make
-
root@ubuntu:/ #make load
其中尤其要注意第三步 make 之后的執行過程和結果,如果沒有順利生成 ch34x.ko 那么就需要查看提示的報錯原因了,然后進行相應問題的查找或者咨詢 tech@wch.cn。在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