動(dòng)下載安裝與故障排查實(shí)戰(zhàn)指南)
1. 從一次設(shè)備管理器里的黃色感嘆號(hào)說(shuō)起搞嵌入式開發(fā)或者工控調(diào)試的人對(duì)下面這個(gè)場(chǎng)景應(yīng)該不陌生插上那塊用了好幾年的USB轉(zhuǎn)串口小板子打開設(shè)備管理器結(jié)果設(shè)備名稱前面頂著一個(gè)刺眼的黃色感嘆號(hào)屬性里寫著“該設(shè)備無(wú)法啟動(dòng)”或者“找不到驅(qū)動(dòng)程序”。這時(shí)候你手頭可能正連著一塊STM32板子等著燒錄固件或者一臺(tái)PLC等著調(diào)參數(shù)串口打不開活就卡住了。FTDI串口驅(qū)動(dòng)就是解決這類問(wèn)題的核心組件之一。FTDI是一家老牌的USB轉(zhuǎn)串口芯片廠商它的FT232、FT2232、FT4232等系列芯片被大量集成在開發(fā)板、調(diào)試器、工業(yè)采集模塊和各種USB轉(zhuǎn)串口線纜里。這些芯片要在操作系統(tǒng)里正常工作必須安裝對(duì)應(yīng)的VCPVirtual COM Port虛擬串口驅(qū)動(dòng)。沒(méi)有驅(qū)動(dòng)系統(tǒng)就認(rèn)不出這個(gè)設(shè)備更別提分配COM端口號(hào)了。這篇內(nèi)容面向的是所有需要跟串口設(shè)備打交道的人嵌入式工程師、工控現(xiàn)場(chǎng)調(diào)試人員、電子愛好者以及偶爾需要連個(gè)串口模塊做數(shù)據(jù)采集的開發(fā)者。我會(huì)把FTDI驅(qū)動(dòng)的下載渠道、安裝方法、版本選擇邏輯、常見故障排查以及和CH340、PL2303這些同類芯片驅(qū)動(dòng)的對(duì)比講清楚。更重要的是我會(huì)分享一些在實(shí)際操作中踩過(guò)的坑和總結(jié)出來(lái)的經(jīng)驗(yàn)這些內(nèi)容在官方文檔里通常找不到但對(duì)解決問(wèn)題往往更管用。2. FTDI驅(qū)動(dòng)的版本譜系與選型邏輯2.1 VCP驅(qū)動(dòng)和D2XX驅(qū)動(dòng)到底裝哪個(gè)FTDI官方提供的驅(qū)動(dòng)其實(shí)分兩大陣營(yíng)很多人下載的時(shí)候看到一堆選項(xiàng)就懵了。這兩個(gè)陣營(yíng)分別是VCPVirtual COM Port驅(qū)動(dòng)和D2XXDirect驅(qū)動(dòng)它們解決的是不同層面的問(wèn)題。VCP驅(qū)動(dòng)的思路是讓USB轉(zhuǎn)串口設(shè)備在系統(tǒng)里模擬成一個(gè)標(biāo)準(zhǔn)的COM端口。裝好之后你在設(shè)備管理器里能看到“USB Serial Port (COMx)”然后任何支持串口通信的軟件——串口助手、SecureCRT、Python的pyserial、甚至Arduino IDE——都能像操作物理串口一樣打開它。這是絕大多數(shù)場(chǎng)景下的首選方案因?yàn)榧嫒菪宰詈貌恍枰拇a。D2XX驅(qū)動(dòng)則繞過(guò)了操作系統(tǒng)的串口子系統(tǒng)提供一套FTDI自己的API應(yīng)用程序直接調(diào)用FTDI的DLL跟芯片通信。這種方式延遲更低、控制更精細(xì)適合需要高速數(shù)據(jù)傳輸或者特殊協(xié)議控制的場(chǎng)景。但代價(jià)是你的程序必須專門針對(duì)D2XX接口來(lái)寫不能直接用標(biāo)準(zhǔn)串口API。提示如果你只是用串口助手調(diào)調(diào)參數(shù)、燒錄固件裝VCP驅(qū)動(dòng)就夠了。只有當(dāng)你明確知道自己的軟件需要D2XX接口比如某些廠商的專用燒錄工具才需要額外安裝D2XX驅(qū)動(dòng)。兩者可以共存但安裝順序有講究后面會(huì)細(xì)說(shuō)。2.2 驅(qū)動(dòng)版本號(hào)里的門道FTDI的VCP驅(qū)動(dòng)版本號(hào)看起來(lái)是一串讓人頭大的數(shù)字比如2.12.36.4、2.12.28、2.10.00這些。這里面其實(shí)有明確的規(guī)律前兩段數(shù)字代表主版本第三段是子版本最后一段是構(gòu)建號(hào)。版本號(hào)越高通常意味著支持的操作系統(tǒng)越新、修復(fù)的bug越多但不一定意味著對(duì)你的設(shè)備最合適。我遇到過(guò)好幾次這樣的情況用最新版驅(qū)動(dòng)反而導(dǎo)致老設(shè)備識(shí)別不穩(wěn)定換回舊版本就正常了。原因在于FTDI在不同版本的驅(qū)動(dòng)里對(duì)芯片固件的要求不同一些早期批次的FT232芯片特別是那些山寨板子上的可能跟最新驅(qū)動(dòng)存在兼容性問(wèn)題。選版本的實(shí)用原則是這樣的Windows 10/11系統(tǒng)優(yōu)先用2.12.36.x或更新的版本這些版本對(duì)新型號(hào)芯片和最新操作系統(tǒng)的支持最完善。Windows 7系統(tǒng)2.12.28或2.10.00比較穩(wěn)妥太新的驅(qū)動(dòng)可能不支持Win7。老設(shè)備2010年以前生產(chǎn)的如果新版驅(qū)動(dòng)裝上去設(shè)備工作不正??梢栽囋?.08.30或2.06.00這些老版本。Linux/macOS內(nèi)核通常自帶FTDI驅(qū)動(dòng)模塊ftdi_sio一般不需要手動(dòng)安裝。除非你需要D2XX接口才需要從FTDI官網(wǎng)下載對(duì)應(yīng)的庫(kù)。2.3 操作系統(tǒng)與驅(qū)動(dòng)版本的對(duì)應(yīng)關(guān)系為了更直觀地說(shuō)明我把常見的操作系統(tǒng)和推薦的驅(qū)動(dòng)版本整理成了一張表操作系統(tǒng)推薦VCP驅(qū)動(dòng)版本備注Windows 112.12.36.4及以上支持自動(dòng)簽名安裝最順暢Windows 102.12.36.4或2.12.28兩者都穩(wěn)定新版對(duì)USB 3.0兼容更好Windows 8.12.12.28新版可能缺少對(duì)8.1的簽名支持Windows 72.10.00或2.08.30需要手動(dòng)處理驅(qū)動(dòng)簽名Windows XP2.06.00或2.04.16老版本才能正常安裝Linux內(nèi)核自帶ftdi_sio無(wú)需手動(dòng)安裝VCPmacOS內(nèi)核自帶Apple FTDI驅(qū)動(dòng)10.9以后版本基本免驅(qū)這張表是我根據(jù)多次實(shí)際安裝經(jīng)驗(yàn)總結(jié)的不是官方文檔的照搬。實(shí)際使用中可能會(huì)因?yàn)樾酒?、主板USB控制器等因素有差異但大方向不會(huì)錯(cuò)。3. 驅(qū)動(dòng)下載渠道的真假辨別與安全獲取3.1 為什么官網(wǎng)下載有時(shí)候反而慢FTDI的官方網(wǎng)站是ftdichip.com驅(qū)動(dòng)下載頁(yè)面在“Drivers”欄目下。按理說(shuō)從官網(wǎng)下載是最安全的選擇但實(shí)際體驗(yàn)過(guò)的人都知道官網(wǎng)服務(wù)器在海外下載速度有時(shí)候慢得讓人抓狂一個(gè)幾MB的驅(qū)動(dòng)包可能要下十幾分鐘甚至斷連。這就催生了一個(gè)現(xiàn)象很多人會(huì)去第三方網(wǎng)站或者網(wǎng)盤找驅(qū)動(dòng)包。但這里面風(fēng)險(xiǎn)很大。我見過(guò)不少所謂的“FTDI驅(qū)動(dòng)下載”頁(yè)面下載下來(lái)的壓縮包里捆綁了廣告軟件甚至惡意程序。更隱蔽的一種做法是第三方打包的驅(qū)動(dòng)里替換了原始的inf文件和sys文件裝上去表面上能用但可能被植入了數(shù)據(jù)截獲邏輯。注意串口驅(qū)動(dòng)運(yùn)行在系統(tǒng)底層權(quán)限很高。一旦驅(qū)動(dòng)被篡改通過(guò)串口傳輸?shù)乃袛?shù)據(jù)——包括調(diào)試信息、設(shè)備參數(shù)、甚至認(rèn)證憑據(jù)——都可能被截獲。所以驅(qū)動(dòng)來(lái)源的安全性怎么強(qiáng)調(diào)都不過(guò)分。3.2 識(shí)別可靠下載源的幾個(gè)硬指標(biāo)那怎么判斷一個(gè)下載源是否可靠我總結(jié)了幾個(gè)判斷標(biāo)準(zhǔn)第一看文件哈希值。FTDI官網(wǎng)會(huì)公布每個(gè)驅(qū)動(dòng)包的SHA-256哈希值。如果你從第三方渠道下載下載后可以自己算一下哈希值跟官網(wǎng)公布的是否一致。一致就說(shuō)明文件沒(méi)有被篡改。Windows上可以用certutil -hashfile 文件名 SHA256命令來(lái)計(jì)算。第二看數(shù)字簽名。正規(guī)的FTDI驅(qū)動(dòng)安裝包和驅(qū)動(dòng)文件都有FTDI Ltd.的數(shù)字簽名。在文件屬性里點(diǎn)“數(shù)字簽名”標(biāo)簽頁(yè)就能看到。如果簽名無(wú)效或者簽名者不是FTDI那這個(gè)文件絕對(duì)不能裝。第三看文件大小和版本號(hào)。官網(wǎng)的驅(qū)動(dòng)包大小是固定的比如2.12.36.4版本的Windows安裝包大約2.5MB左右。如果下載下來(lái)發(fā)現(xiàn)大小差很多或者版本號(hào)對(duì)不上就要警惕了。第四優(yōu)先選擇有HTTPS的網(wǎng)站。雖然HTTPS不能保證內(nèi)容一定安全但至少說(shuō)明網(wǎng)站運(yùn)營(yíng)者有一定的安全意識(shí)比那些純HTTP的下載站靠譜得多。3.3 離線安裝包的獲取與校驗(yàn)實(shí)操如果你需要在沒(méi)有網(wǎng)絡(luò)的工控現(xiàn)場(chǎng)安裝驅(qū)動(dòng)提前準(zhǔn)備離線安裝包就很重要。我的做法是這樣的在有網(wǎng)絡(luò)的機(jī)器上從FTDI官網(wǎng)下載對(duì)應(yīng)版本的驅(qū)動(dòng)安裝包通常是exe格式和獨(dú)立的驅(qū)動(dòng)文件包zip格式。下載完成后立即計(jì)算哈希值并跟官網(wǎng)公布的值比對(duì)。把安裝包和哈希值記錄一起拷貝到U盤里。在現(xiàn)場(chǎng)安裝前再次計(jì)算哈希值確認(rèn)文件沒(méi)有在拷貝過(guò)程中損壞。計(jì)算哈希值的命令很簡(jiǎn)單# Windows certutil -hashfile CDM212364_Setup.exe SHA256 # Linux/macOS shasum -a 256 CDM212364_Setup.exe如果哈希值跟官網(wǎng)公布的一致就可以放心安裝。不一致的話要么是下載不完整要么是被篡改了都不能用。4. 安裝過(guò)程中的關(guān)鍵步驟與常見卡點(diǎn)4.1 安裝前的準(zhǔn)備工作很多人拿到驅(qū)動(dòng)包就直接雙擊安裝結(jié)果裝到一半報(bào)錯(cuò)或者裝完設(shè)備還是認(rèn)不出來(lái)。其實(shí)安裝前有幾件事需要先確認(rèn)確認(rèn)設(shè)備芯片型號(hào)。FTDI的芯片型號(hào)很多FT232RL、FT232H、FT2232D、FT2232H、FT4232H等等。雖然VCP驅(qū)動(dòng)是通用的但某些特殊型號(hào)比如FT232H的高速模式可能需要額外的配置。你可以在設(shè)備管理器的硬件ID里看到具體的VID和PIDFTDI的VID通常是0403PID則因型號(hào)而異。確認(rèn)系統(tǒng)架構(gòu)。32位系統(tǒng)和64位系統(tǒng)需要不同的驅(qū)動(dòng)文件。雖然安裝包通常會(huì)自動(dòng)判斷但如果你手動(dòng)指定inf文件安裝選錯(cuò)了架構(gòu)就會(huì)失敗。關(guān)閉驅(qū)動(dòng)簽名強(qiáng)制僅限舊系統(tǒng)。Windows 7及更早版本在安裝沒(méi)有微軟簽名的驅(qū)動(dòng)時(shí)會(huì)攔截。FTDI的新版驅(qū)動(dòng)通常有微軟簽名但老版本可能沒(méi)有。如果遇到簽名問(wèn)題可以在開機(jī)時(shí)按F8選擇“禁用驅(qū)動(dòng)程序簽名強(qiáng)制”或者用bcdedit命令臨時(shí)關(guān)閉。卸載舊版驅(qū)動(dòng)。如果之前裝過(guò)其他版本的FTDI驅(qū)動(dòng)最好先卸載干凈再裝新版。殘留的舊驅(qū)動(dòng)文件可能導(dǎo)致沖突。卸載后建議重啟一次讓系統(tǒng)徹底清理。4.2 安裝程序的選項(xiàng)該怎么選運(yùn)行FTDI的安裝程序后會(huì)出現(xiàn)幾個(gè)選項(xiàng)很多人不知道該怎么選。我逐個(gè)解釋一下安裝程序首先會(huì)問(wèn)你是要“安裝驅(qū)動(dòng)”還是“解壓驅(qū)動(dòng)文件”。如果你只是要給當(dāng)前電腦裝驅(qū)動(dòng)選“安裝”就行。但如果你需要給多臺(tái)電腦裝或者需要在沒(méi)有安裝程序的系統(tǒng)上手動(dòng)指定驅(qū)動(dòng)就選“解壓”把驅(qū)動(dòng)文件提取到一個(gè)文件夾里備用。接下來(lái)會(huì)問(wèn)安裝類型“VCP驅(qū)動(dòng)”還是“D2XX驅(qū)動(dòng)”。前面說(shuō)過(guò)大多數(shù)場(chǎng)景選VCP就夠了。但如果你不確定可以兩個(gè)都裝。安裝程序支持同時(shí)安裝兩種驅(qū)動(dòng)它們不會(huì)沖突。還有一個(gè)選項(xiàng)是“USB Serial Converter”和“USB Serial Port”的區(qū)別。前者是底層USB設(shè)備驅(qū)動(dòng)后者是上層虛擬串口驅(qū)動(dòng)。兩個(gè)都需要安裝安裝程序默認(rèn)都會(huì)勾選不用改。4.3 設(shè)備管理器里的手動(dòng)指定驅(qū)動(dòng)方法有時(shí)候自動(dòng)安裝程序跑完了設(shè)備管理器里還是黃色感嘆號(hào)。這時(shí)候就需要手動(dòng)指定驅(qū)動(dòng)。步驟如下右鍵點(diǎn)擊有問(wèn)題的設(shè)備選擇“更新驅(qū)動(dòng)程序”。選擇“瀏覽我的電腦以查找驅(qū)動(dòng)程序”。指向你解壓出來(lái)的驅(qū)動(dòng)文件夾注意要指向包含inf文件的目錄。勾選“包括子文件夾”。點(diǎn)擊下一步系統(tǒng)會(huì)搜索并安裝匹配的驅(qū)動(dòng)。如果系統(tǒng)提示“已安裝最適合的驅(qū)動(dòng)程序”但設(shè)備仍然不能用說(shuō)明系統(tǒng)認(rèn)為當(dāng)前驅(qū)動(dòng)已經(jīng)是最優(yōu)的但實(shí)際上有問(wèn)題。這時(shí)候需要先卸載設(shè)備勾選“刪除此設(shè)備的驅(qū)動(dòng)程序軟件”然后重新掃描硬件改動(dòng)再手動(dòng)指定驅(qū)動(dòng)。提示在Windows 10/11上如果手動(dòng)指定驅(qū)動(dòng)時(shí)提示“指定的文件夾沒(méi)有包含設(shè)備的兼容軟件驅(qū)動(dòng)程序”通常是因?yàn)閕nf文件里的硬件ID跟你的設(shè)備不匹配??梢源蜷_inf文件搜索你的設(shè)備硬件ID在設(shè)備管理器的“詳細(xì)信息”標(biāo)簽頁(yè)里可以看到確認(rèn)inf文件里是否包含這個(gè)ID。4.4 安裝后的驗(yàn)證COM端口是否真的可用驅(qū)動(dòng)裝好了設(shè)備管理器里也看到COM端口了但這不代表就萬(wàn)事大吉了。我習(xí)慣做幾個(gè)驗(yàn)證步驟第一步確認(rèn)端口號(hào)。在設(shè)備管理器的“端口(COM和LPT)”下面找到“USB Serial Port (COMx)”記下這個(gè)COM號(hào)。如果COM號(hào)大于10有些老軟件可能不支持需要在端口屬性里改成COM1到COM9之間的號(hào)。第二步用串口助手做回環(huán)測(cè)試。把USB轉(zhuǎn)串口模塊的TX和RX短接然后用串口助手發(fā)送數(shù)據(jù)看能不能收到同樣的數(shù)據(jù)。能收到說(shuō)明驅(qū)動(dòng)和硬件都正常。這個(gè)測(cè)試能排除大部分驅(qū)動(dòng)層面的問(wèn)題。第三步檢查端口設(shè)置。在端口屬性里確認(rèn)波特率、數(shù)據(jù)位、停止位、校驗(yàn)位這些參數(shù)跟你的設(shè)備匹配。雖然這些參數(shù)在打開串口時(shí)會(huì)被軟件重新設(shè)置但默認(rèn)值不對(duì)有時(shí)候會(huì)導(dǎo)致一些奇怪的問(wèn)題。第四步長(zhǎng)時(shí)間穩(wěn)定性測(cè)試。如果是用于工控現(xiàn)場(chǎng)建議讓串口持續(xù)通信一段時(shí)間比如半小時(shí)觀察是否出現(xiàn)斷連、數(shù)據(jù)丟失等情況。有些驅(qū)動(dòng)版本在長(zhǎng)時(shí)間高負(fù)載下會(huì)出問(wèn)題提前發(fā)現(xiàn)比現(xiàn)場(chǎng)出故障要好。5. 那些讓人抓狂的故障與排查鏈路5.1 端口拒絕訪問(wèn)從現(xiàn)象到根因的完整排查“端口拒絕訪問(wèn)”或者“Access Denied”是串口調(diào)試中最常見的錯(cuò)誤之一?,F(xiàn)象是程序打開串口時(shí)報(bào)錯(cuò)提示端口被占用或拒絕訪問(wèn)。這個(gè)問(wèn)題的排查鏈路比較長(zhǎng)我按實(shí)際排查順序來(lái)梳理。第一層排查是否有其他程序占用了端口。這是最常見的原因。串口是獨(dú)占資源同一時(shí)間只能被一個(gè)程序打開??赡苷加枚丝诘某绦虬硪粋€(gè)串口助手、Arduino IDE的串口監(jiān)視器、某些后臺(tái)運(yùn)行的調(diào)試服務(wù)、甚至是你自己之前打開過(guò)但沒(méi)正常關(guān)閉的程序。排查方法是關(guān)閉所有可能使用串口的程序然后重試。如果還是不行可以用工具查看端口占用情況。Windows上可以用handle.exe或者PowerShell的Get-Process配合端口查詢。第二層排查驅(qū)動(dòng)層面的端口殘留。有時(shí)候程序異常退出后驅(qū)動(dòng)沒(méi)有正確釋放端口導(dǎo)致端口處于“被占用”狀態(tài)但實(shí)際沒(méi)有程序在用。這種情況在FTDI的某些驅(qū)動(dòng)版本上出現(xiàn)過(guò)。解決方法是在設(shè)備管理器里禁用再啟用該設(shè)備或者直接拔插USB。如果頻繁出現(xiàn)考慮換一個(gè)驅(qū)動(dòng)版本。第三層排查USB電源管理導(dǎo)致的斷連。Windows的USB選擇性暫停功能會(huì)在設(shè)備空閑時(shí)切斷供電導(dǎo)致設(shè)備斷連。當(dāng)程序再次嘗試打開端口時(shí)設(shè)備可能還沒(méi)重新枚舉完成就報(bào)了拒絕訪問(wèn)。解決方法是在設(shè)備管理器的USB根集線器屬性里取消勾選“允許計(jì)算機(jī)關(guān)閉此設(shè)備以節(jié)約電源”。這個(gè)設(shè)置對(duì)工控現(xiàn)場(chǎng)的設(shè)備特別重要。第四層排查硬件層面的問(wèn)題。如果以上都排除了就要考慮硬件。USB線纜接觸不良、USB口供電不足、芯片本身?yè)p壞都可能導(dǎo)致端口異常。換一根線、換一個(gè)USB口試試是最快的驗(yàn)證方法。5.2 設(shè)備識(shí)別但無(wú)法打開串口的幾種典型情況設(shè)備管理器里能看到COM端口但程序就是打不開這種情況比“端口拒絕訪問(wèn)”更隱蔽。我遇到過(guò)以下幾種典型情況情況一COM端口號(hào)沖突。兩個(gè)設(shè)備被分配了同一個(gè)COM號(hào)系統(tǒng)里看起來(lái)有兩個(gè)端口但實(shí)際指向同一個(gè)資源。這種情況通常發(fā)生在頻繁插拔不同USB轉(zhuǎn)串口設(shè)備之后。解決方法是在設(shè)備管理器里把每個(gè)FTDI設(shè)備的COM號(hào)手動(dòng)改成不同的值并且盡量固定在COM1-COM9范圍內(nèi)。情況二驅(qū)動(dòng)版本與芯片固件不匹配。某些批次的FTDI芯片特別是早期版本需要特定版本的驅(qū)動(dòng)才能正常工作。新版驅(qū)動(dòng)雖然能識(shí)別設(shè)備但在打開端口時(shí)初始化失敗。解決方法是換用舊版驅(qū)動(dòng)比如2.08.30或2.06.00。情況三USB帶寬不足。如果你同時(shí)接了多個(gè)USB設(shè)備特別是USB攝像頭、移動(dòng)硬盤這類高帶寬設(shè)備USB總線的帶寬可能不夠分配給串口設(shè)備。雖然串口本身帶寬需求很低但在某些USB控制器上帶寬分配是粗粒度的。解決方法是把串口設(shè)備插到不同的USB控制器上比如前面板和后置面板通常屬于不同的控制器。情況四安全軟件攔截。某些安全軟件會(huì)監(jiān)控串口訪問(wèn)誤判為可疑行為并攔截。排查方法是臨時(shí)關(guān)閉安全軟件試試。如果確認(rèn)是安全軟件的問(wèn)題需要在安全軟件里把串口通信程序加入白名單。5.3 重連后端口異常的深層原因“程序連接串口成功端口后重連出現(xiàn)端口拒絕訪問(wèn)”——這個(gè)描述精準(zhǔn)地描述了一個(gè)經(jīng)典問(wèn)題第一次連接正常斷開后重新連接就失敗。這個(gè)問(wèn)題的根因通常不在驅(qū)動(dòng)本身而在程序的串口資源管理邏輯。很多程序在關(guān)閉串口時(shí)沒(méi)有正確釋放資源。比如只調(diào)用了關(guān)閉文件句柄的API但沒(méi)有取消串口的事件監(jiān)聽或者沒(méi)有等待所有待處理的I/O操作完成。這導(dǎo)致驅(qū)動(dòng)層面認(rèn)為端口仍然被占用。當(dāng)程序再次嘗試打開同一個(gè)端口時(shí)就被拒絕了。解決這個(gè)問(wèn)題需要從兩個(gè)層面入手。程序?qū)用娲_保關(guān)閉串口時(shí)完整執(zhí)行以下步驟取消所有異步I/O、關(guān)閉事件句柄、調(diào)用CloseHandle、等待驅(qū)動(dòng)確認(rèn)端口釋放。驅(qū)動(dòng)層面如果程序已經(jīng)正確關(guān)閉但端口仍然被占用可以嘗試在設(shè)備管理器里禁用再啟用設(shè)備強(qiáng)制驅(qū)動(dòng)釋放資源。我在實(shí)際項(xiàng)目中總結(jié)了一個(gè)經(jīng)驗(yàn)對(duì)于需要頻繁重連的場(chǎng)景不要反復(fù)打開關(guān)閉同一個(gè)COM端口而是保持端口打開通過(guò)協(xié)議層面的握手來(lái)判斷設(shè)備是否在線。這樣可以避免大部分重連問(wèn)題。5.4 驅(qū)動(dòng)安裝失敗的錯(cuò)誤代碼對(duì)照安裝FTDI驅(qū)動(dòng)時(shí)Windows可能會(huì)報(bào)出各種錯(cuò)誤代碼。我把常見的幾個(gè)整理出來(lái)方便對(duì)照排查錯(cuò)誤代碼含義解決方法代碼10設(shè)備無(wú)法啟動(dòng)換USB口檢查供電換驅(qū)動(dòng)版本代碼28驅(qū)動(dòng)未安裝手動(dòng)指定驅(qū)動(dòng)文件夾代碼43設(shè)備報(bào)告故障硬件問(wèn)題居多換線換設(shè)備測(cè)試代碼52數(shù)字簽名驗(yàn)證失敗關(guān)閉驅(qū)動(dòng)簽名強(qiáng)制或用新版簽名驅(qū)動(dòng)代碼39驅(qū)動(dòng)文件損壞或缺失卸載后重新安裝清理殘留文件這些錯(cuò)誤代碼在設(shè)備管理器的設(shè)備屬性里可以看到。看到錯(cuò)誤代碼先別急著搜對(duì)照這張表基本能定位方向。6. FTDI與CH340、PL2303的驅(qū)動(dòng)差異與選擇建議6.1 三種常見USB轉(zhuǎn)串口芯片的驅(qū)動(dòng)特性對(duì)比FTDI、CH340、PL2303是市面上最常見的三種USB轉(zhuǎn)串口芯片。它們各自的驅(qū)動(dòng)特性差異很大了解這些差異有助于你在遇到問(wèn)題時(shí)快速判斷方向。FTDI的芯片價(jià)格最高但驅(qū)動(dòng)最成熟、兼容性最好。它的VCP驅(qū)動(dòng)經(jīng)過(guò)多年迭代在Windows、Linux、macOS上的表現(xiàn)都很穩(wěn)定。WHQL認(rèn)證的驅(qū)動(dòng)版本可以直接通過(guò)Windows Update分發(fā)安裝最省心。缺點(diǎn)是芯片和成品線纜價(jià)格較高而且市場(chǎng)上存在大量山寨FTDI芯片這些山寨芯片可能跟官方驅(qū)動(dòng)存在兼容性問(wèn)題。CH340是南京沁恒的產(chǎn)品價(jià)格低廉被大量用于Arduino兼容板和廉價(jià)USB轉(zhuǎn)串口模塊。它的驅(qū)動(dòng)安裝簡(jiǎn)單但在某些Windows版本上需要手動(dòng)安裝而且不同批次的CH340芯片CH340G、CH340C、CH340B等可能需要不同版本的驅(qū)動(dòng)。CH340的驅(qū)動(dòng)穩(wěn)定性在長(zhǎng)時(shí)間高負(fù)載場(chǎng)景下不如FTDI。PL2303是旺玖科技的產(chǎn)品曾經(jīng)非常流行但現(xiàn)在市面上有很多老版本的PL2303芯片特別是PL2303HXA已經(jīng)不被新版驅(qū)動(dòng)支持。如果你買到了庫(kù)存老芯片做的線纜裝最新驅(qū)動(dòng)反而不能用必須找特定版本的舊驅(qū)動(dòng)。這是PL2303用戶最常踩的坑。6.2 什么場(chǎng)景該選哪種芯片選擇哪種芯片取決于你的具體需求工業(yè)現(xiàn)場(chǎng)、長(zhǎng)期運(yùn)行、高可靠性要求選FTDI。貴有貴的道理驅(qū)動(dòng)穩(wěn)定性和芯片一致性是最好的。學(xué)生實(shí)驗(yàn)、臨時(shí)調(diào)試、成本敏感CH340夠用。幾塊錢的模塊就能解決問(wèn)題驅(qū)動(dòng)雖然偶爾出問(wèn)題但基本能用。老設(shè)備維護(hù)、已有PL2303線纜先確認(rèn)芯片版本。如果是PL2303HXA去找3.3.2.102或更早版本的驅(qū)動(dòng)。如果是PL2303TA或PL2303SA可以用新版驅(qū)動(dòng)。需要D2XX接口或高速傳輸只有FTDI支持D2XX別無(wú)選擇。6.3 驅(qū)動(dòng)共存時(shí)的沖突處理一臺(tái)電腦上同時(shí)裝了FTDI、CH340、PL2303的驅(qū)動(dòng)會(huì)不會(huì)沖突答案是通常不會(huì)但有幾個(gè)注意事項(xiàng)。這三種芯片的VID不同F(xiàn)TDI是0403CH340是1A86PL2303是067B所以系統(tǒng)能正確區(qū)分它們不會(huì)出現(xiàn)驅(qū)動(dòng)互相覆蓋的情況。但是如果三種設(shè)備同時(shí)插在電腦上COM端口號(hào)的分配可能會(huì)混亂。我的做法是給每種芯片的端口號(hào)設(shè)定一個(gè)范圍FTDI用COM1-COM9CH340用COM10-COM19PL2303用COM20-COM29。這樣一看端口號(hào)就知道是哪種設(shè)備。另一個(gè)注意事項(xiàng)是驅(qū)動(dòng)安裝順序。建議先裝FTDI驅(qū)動(dòng)再裝CH340最后裝PL2303。因?yàn)镻L2303的某些舊版驅(qū)動(dòng)安裝時(shí)會(huì)替換系統(tǒng)的串口驅(qū)動(dòng)文件可能影響其他芯片的工作。如果先裝了PL2303再裝FTDI有時(shí)候需要重新安裝FTDI驅(qū)動(dòng)才能恢復(fù)正常。7. 驅(qū)動(dòng)維護(hù)與長(zhǎng)期穩(wěn)定運(yùn)行的經(jīng)驗(yàn)7.1 驅(qū)動(dòng)更新策略什么時(shí)候該更新什么時(shí)候不該驅(qū)動(dòng)更新這件事我的原則是能用就不要?jiǎng)?。特別是工控現(xiàn)場(chǎng)的設(shè)備一旦調(diào)通了除非遇到明確的問(wèn)題否則不要輕易更新驅(qū)動(dòng)。我見過(guò)太多因?yàn)槭仲v更新驅(qū)動(dòng)導(dǎo)致設(shè)備罷工的案例。那什么時(shí)候該更新以下幾種情況可以考慮換了新操作系統(tǒng)舊驅(qū)動(dòng)不兼容。遇到了明確的驅(qū)動(dòng)bug比如前面說(shuō)的端口殘留問(wèn)題且新版本修復(fù)了這個(gè)問(wèn)題。需要使用新芯片型號(hào)舊驅(qū)動(dòng)不支持。安全更新修復(fù)了已知漏洞。更新前一定要做的一件事是備份當(dāng)前能正常工作的驅(qū)動(dòng)。Windows上可以用pnputil命令導(dǎo)出驅(qū)動(dòng)包或者直接用驅(qū)動(dòng)備份工具。這樣萬(wàn)一新驅(qū)動(dòng)有問(wèn)題可以快速回滾。7.2 制作便攜式驅(qū)動(dòng)工具包對(duì)于經(jīng)常需要跑現(xiàn)場(chǎng)的人來(lái)說(shuō)一個(gè)便攜式驅(qū)動(dòng)工具包能省很多事。我的工具包里包含以下內(nèi)容FTDI VCP驅(qū)動(dòng)多個(gè)版本2.12.36.4、2.12.28、2.10.00、2.08.30CH340驅(qū)動(dòng)包含不同版本PL2303驅(qū)動(dòng)包含支持老芯片的舊版本驅(qū)動(dòng)簽名強(qiáng)制關(guān)閉工具端口占用查看工具串口回環(huán)測(cè)試工具一份記錄各種錯(cuò)誤代碼和解決方法的文本文件這個(gè)工具包放在U盤里隨身帶到了現(xiàn)場(chǎng)不管遇到什么串口驅(qū)動(dòng)問(wèn)題基本都能搞定。工具包里的驅(qū)動(dòng)文件都要提前校驗(yàn)哈希值確保沒(méi)有被篡改。7.3 從驅(qū)動(dòng)日志中定位問(wèn)題的技巧Windows會(huì)記錄驅(qū)動(dòng)安裝和運(yùn)行的日志這些日志在排查問(wèn)題時(shí)非常有用。查看方法是在事件查看器里找到“Windows日志”-“系統(tǒng)”然后篩選來(lái)源為“Kernel-PnP”或“Service Control Manager”的事件。FTDI驅(qū)動(dòng)在安裝和運(yùn)行時(shí)也會(huì)寫日志。你可以在注冊(cè)表里開啟FTDI的調(diào)試日志功能具體位置在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ftdi_sio下面把DebugLevel的值改成2或更高。開啟后驅(qū)動(dòng)會(huì)在系統(tǒng)臨時(shí)目錄里生成詳細(xì)的日志文件記錄設(shè)備枚舉、端口創(chuàng)建、數(shù)據(jù)傳輸?shù)冗^(guò)程。這些日志對(duì)于定位深層次的驅(qū)動(dòng)問(wèn)題很有幫助。不過(guò)要注意調(diào)試日志會(huì)占用系統(tǒng)資源問(wèn)題解決后記得把DebugLevel改回0。7.4 長(zhǎng)期運(yùn)行場(chǎng)景下的驅(qū)動(dòng)參數(shù)調(diào)優(yōu)對(duì)于需要7x24小時(shí)運(yùn)行的工控場(chǎng)景FTDI驅(qū)動(dòng)有幾個(gè)參數(shù)可以調(diào)優(yōu)提升穩(wěn)定性Latency Timer延遲定時(shí)器默認(rèn)值是16毫秒意思是驅(qū)動(dòng)會(huì)等待最多16毫秒來(lái)攢夠數(shù)據(jù)再一次性傳給應(yīng)用程序。對(duì)于實(shí)時(shí)性要求高的場(chǎng)景可以把這個(gè)值調(diào)小比如1毫秒。但調(diào)太小會(huì)增加USB通信頻率可能影響穩(wěn)定性。在設(shè)備管理器的端口屬性-高級(jí)設(shè)置里可以改這個(gè)值。USB Transfer SizeUSB傳輸大小默認(rèn)是4096字節(jié)。對(duì)于大數(shù)據(jù)量傳輸可以適當(dāng)增大。但對(duì)于小數(shù)據(jù)包頻繁通信的場(chǎng)景增大反而增加延遲。Timeout設(shè)置在應(yīng)用程序?qū)用嬖O(shè)置合理的讀寫超時(shí)避免因?yàn)樵O(shè)備暫時(shí)無(wú)響應(yīng)導(dǎo)致程序卡死。FTDI的D2XX接口提供了豐富的超時(shí)控制參數(shù)VCP接口則依賴應(yīng)用程序自己的超時(shí)設(shè)置。這些參數(shù)的調(diào)整需要根據(jù)具體場(chǎng)景來(lái)定沒(méi)有萬(wàn)能的最優(yōu)值。我的建議是先用默認(rèn)值跑一段時(shí)間觀察是否有問(wèn)題再針對(duì)性地調(diào)整。8. 一些零散但實(shí)用的經(jīng)驗(yàn)補(bǔ)充關(guān)于FTDI串口驅(qū)動(dòng)還有一些零散的經(jīng)驗(yàn)值得分享。關(guān)于山寨芯片的識(shí)別。市場(chǎng)上有很多山寨FTDI芯片它們用官方驅(qū)動(dòng)也能工作但可能在某些版本驅(qū)動(dòng)下被識(shí)別為“非原裝”并限制功能。識(shí)別方法是看芯片表面的激光刻字是否清晰、是否有FTDI的logo。更可靠的方法是用FTDI的FT_PROG工具讀取芯片的EEPROM信息原裝芯片會(huì)有正確的廠商信息和序列號(hào)。關(guān)于USB線纜的選擇。串口通信不穩(wěn)定有時(shí)候問(wèn)題出在線纜上。劣質(zhì)USB線纜的阻抗不匹配、屏蔽層缺失會(huì)導(dǎo)致數(shù)據(jù)傳輸出錯(cuò)。特別是長(zhǎng)度超過(guò)1米的線纜質(zhì)量差異影響很大。我的經(jīng)驗(yàn)是選帶磁環(huán)的屏蔽線長(zhǎng)度控制在1.5米以內(nèi)。關(guān)于多設(shè)備同時(shí)使用的端口管理。如果你同時(shí)使用多個(gè)FTDI設(shè)備建議給每個(gè)設(shè)備在EEPROM里寫入自定義的序列號(hào)。這樣Windows會(huì)根據(jù)序列號(hào)來(lái)分配固定的COM端口號(hào)不管插在哪個(gè)USB口上端口號(hào)都不會(huì)變。這個(gè)功能用FT_PROG工具就能實(shí)現(xiàn)對(duì)于需要固定端口號(hào)的工控軟件特別有用。關(guān)于虛擬機(jī)里的串口映射。在虛擬機(jī)里使用USB轉(zhuǎn)串口設(shè)備需要把USB設(shè)備直接映射給虛擬機(jī)而不是映射COM端口。因?yàn)樘摂M機(jī)里的操作系統(tǒng)需要自己加載驅(qū)動(dòng)來(lái)管理設(shè)備。映射COM端口的方式在虛擬機(jī)里通常不好用延遲高且不穩(wěn)定。關(guān)于驅(qū)動(dòng)安裝后的系統(tǒng)重啟。雖然FTDI驅(qū)動(dòng)安裝后通常不需要重啟但我建議還是重啟一次。因?yàn)轵?qū)動(dòng)文件在安裝過(guò)程中可能被系統(tǒng)鎖定重啟能讓所有文件正確加載。特別是當(dāng)你從舊版本升級(jí)到新版本時(shí)重啟能避免很多奇怪的問(wèn)題。這些經(jīng)驗(yàn)都是我在實(shí)際項(xiàng)目中一點(diǎn)一點(diǎn)積累的有些是踩了坑才明白的。串口驅(qū)動(dòng)這個(gè)東西看起來(lái)簡(jiǎn)單但真遇到問(wèn)題時(shí)排查起來(lái)可能很費(fèi)時(shí)間。希望這些內(nèi)容能幫你少走一些彎路。