CH340和UART系列上沒有存儲可放置唯一ID的存儲區。這也是PL2303類型的問題。我一直在努力尋找解決此問題的方法。首先,最簡單的是設備在USB總線上的位置。對於每個設備,它都是唯一的。如果您使用的是Linux,則可以在/ dev / serial / by-path下找到每個設備。還有一個/ dev / serial / by-id,但是此設備在那裡只有一個條目,因為它顯示了最後一個已連接的條目。 FTDI芯片將在此處分別具有唯一的條目。便宜的芯片不會,但是它們每個都在/ dev / serial / by-path下有一個條目,該位置和設備名稱應該在重啟後仍然存在。如果您的USB設備有很多更改,請將所有CH340設備插入同一集線器,然後再插入。這些設備將按照插入集線器的順序進行枚舉。這種單中心的技巧也適用於MacOS和Windows,它們應該以相同的順序出現。
Harder方法-udev規則。對於具有唯一ID(例如FTDI)的設備,您可以設置udev規則看到它的序列號,然後創建到該設備的符號鏈接,這很簡單。
對於具有相同或沒有序列號的設備,它要復雜得多。我創建了一個udev規則,如下所示:
SUBSYSTEM ==“ tty”,ATTRS {product} ==“ USB2.0-Serial”,RUN + =“ / usr / local / bin / cheapduino。 py%k“,ATTRS {idVendor} ==” 1a86“,ATTRS {idProduct} ==” 7523“,ENV {ID_MM_DEVICE_IGNORE} =” 1“
當設備與以下產品和供應商匹配時cheap arduino,它以設備作為參數運行腳本“ cheapduino.py”,例如
cheapduino.py ttyUSB0
然後,cheapduino腳本通過串行連接到設備並發送字符串“ ID”和設備上的軟件響應DEVID = THX1138或其他。然後,腳本創建一個指向/ dev / ttyUSB0的符號鏈接/ dev / THX1138
此方法有很多缺點。如果cheapduino上的軟件沒有響應,則腳本必須超時。同樣,這沒有使用udev的SYMLINK函數,因此它不會在斷開連接時清除死鏈接,但在重新連接時會覆蓋它們。您所有的cheapduinos必須在其軟件中具有此功能,並且設置了不同的設備ID。它們都必須使用與腳本相同的波特率,除非您想編寫一個非常複雜的腳本,並且需要很長時間。最後,此方法在低波特率下比在高波特率下效果更好,由於時序原因,這種方法可能不會每次都成功。 (cheapduinos很便宜!)9600比115200更好,後者在幾次嘗試後仍能工作。但是,由於使用此方法您所有的CH340 arduino必須保持相同的速度,因此只能與最快的設備一樣慢。這些便宜的東西太多了。
最後,購買正版的Arduino,或者至少購買帶有FTDI芯片或其他能夠發送唯一設備ID的東西。 >