2010-09-10 47 views
3

我有一個應用程序應該與多個自定義設備通信,其中一些使用FTDI USB到串行轉換器芯片,其中一些使用TCP。應用程序需要能夠隨時接受來自可能隨時插入或拔出的設備的數據;該應用程序充當設備和數據庫之間的橋樑。防止.net串行端口崩潰FTDI USB設備斷開連接

看起來,當設備被拔掉時,它通常會導致SerialPort類在BackgroundWorker線程中拋出異常並導致應用程序崩潰。

我目前的補救措施,這可能是荒謬的複雜的,是有一個幫助應用程序發送/接收串行端口數據並將其中繼/從TCP套接字。當我的主應用程序看到USB設備插入時,它會啓動這個其他應用程序,然後使用TCP套接字與它進行通信。如果插入多個USB設備,則會爲每個USB設備啓動一個單獨的幫助程序實例。拔下USB端口後,助手應用程序將崩潰,但「意外關機」消息將被扼殺。

這種方法很有效,但它似乎很不令人滿意。有一個更好的方法。

回答

8

我與.NET 2.0一樣的問題,我恢復到使用FTDI DLL包裝: http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp/FTD2XX_NET_1010.zip

工作得非常好,你可以訪問控制驅動器的真正的好東西,比如編程設置延遲計時器。

當我試圖讀取數據時,通過捕獲FT_IO_ERROR事件,我編寫了自己的類來檢測拔出事件。這不是完全令人滿意的,通過發現錯誤並聲稱它是一個拔下插頭。但它的工作。

我一直在談論FTDI這件事,最近他們發佈了一個新的應用筆記: http://ftdichip.com/Support/Documents/AppNotes/AN_152_Detecting_USB_%20Device_Insertion_and_Removal.pdf

使用的WM_DEVICECHANGE事件來檢測USB拔掉。也有效,但有一個小捕獲。因爲它是一個窗口消息,所以只有當您擁有GUI時纔有效,並且有些情況下事件不會到達您的應用程序,如果另一個應用程序正在運行並捕獲該事件,然後您可以處理它。

最後一個選項是使用WMI進行檢測。您可以使用ManagementEventWatcher 在創建和刪除時創建偵聽器。也得到了這個工作,但是我的筆記本電腦上有一些USB端口,FTDI驅動程序不會給出正確的COM端口和位置ID(實際上,根本就沒有),這是我可以從WMI讀取的信息,所以我無法將WMI事件鏈接到DLL封裝器中的連接設備。

我在2010年6月/ 7月向FTDI報告了這個問題,並且假定GetCOMportNumber和Location ID問題在其2.08.02驅動程序版本(8月)中得到修復,但我沒有時間重新檢查此問題。

到目前爲止我的經驗與USB地獄....

+0

感謝您的回覆。如果我有時間,我會研究一下。我一直使用單獨的ap來處理端口連接,雖然這種方法感覺非常噁心,但它一直運行得很好,所以沒有主要的改變動力。但是,對於未來的項目,當然很高興。 – supercat 2010-10-13 14:50:51

+0

NP。我一直想寫一篇關於所有這些地方的博客文章,以供將來參考,所以我可以多一點幫助,但是現在的代碼太雜亂了...... – Rogier 2010-10-14 11:50:44

1

我已經測試在使用.Net 4.0時刪除USB到串行適配器。它不會像以前版本的.Net一樣導致應用程序崩潰。此外,在以前的版本中,不僅會導致應用程序崩潰,而且有時您必須重新啓動才能使端口正常工作。

+0

.NET 4.0需要什麼版本的Windows?現在我使用2.0,這意味着我的應用程序將在Windows 98或2000下運行,但我不確定有多少終端用戶仍在運行此類系統。 – supercat 2010-09-13 14:58:34

+0

.NET 4.0需要Windows XP SP3。 – Rogier 2010-10-13 12:08:14

+0

您能否提供您用於測試XP,Vista或Win7的操作系統信息? – volody 2011-03-28 20:03:08

相關問題