Vb.net 防止FTDI USB设备断开连接时.net串行端口崩溃

Vb.net 防止FTDI USB设备断开连接时.net串行端口崩溃,vb.net,usb,serial-port,Vb.net,Usb,Serial Port,我有一个应用程序,它应该与多个定制设备通信,其中一些使用FTDI USB到串行转换芯片,一些使用TCP。应用程序需要能够在任何时候从可以随时插入或拔出的设备接收数据;该应用程序充当设备和数据库之间的桥梁 似乎当一个设备被拔出时,它通常会导致SerialPort类在BackgroundWorker线程中抛出异常并使应用程序崩溃 我目前的补救措施可能非常复杂,就是让助手应用程序发送/接收串行端口数据,并将其中继到TCP套接字,或从TCP套接字中继。当我的主应用程序看到USB设备已插入时,它会启动另一

我有一个应用程序,它应该与多个定制设备通信,其中一些使用FTDI USB到串行转换芯片,一些使用TCP。应用程序需要能够在任何时候从可以随时插入或拔出的设备接收数据;该应用程序充当设备和数据库之间的桥梁

似乎当一个设备被拔出时,它通常会导致SerialPort类在BackgroundWorker线程中抛出异常并使应用程序崩溃

我目前的补救措施可能非常复杂,就是让助手应用程序发送/接收串行端口数据,并将其中继到TCP套接字,或从TCP套接字中继。当我的主应用程序看到USB设备已插入时,它会启动另一个应用程序,然后使用TCP套接字与之通信。如果插入了多个USB设备,则会为每个设备启动一个单独的helper应用程序实例。拔下USB端口时,helper应用程序将崩溃,但“意外关机”消息将被抑制


这种方法是可行的,但似乎非常不令人满意。肯定有更好的方法。

我已经测试过在.Net 4.0下使用时移除USB到串行适配器。它不会像以前的.Net版本那样导致应用程序崩溃。此外,在以前的版本中,不仅应用程序会崩溃,有时还必须重新启动才能使端口正常工作。

我在.NET 2.0中遇到了同样的问题,我恢复使用FTDI dll包装器:

工作非常好,您可以控制驱动程序的真正优点,例如通过编程设置延迟计时器

我编写了自己的类来检测拔掉事件,方法是在尝试读取数据时捕获FT_IO_错误事件。这并不是完全令人满意的,因为捕捉到一个错误并声称它是一个拔掉。但它是有效的

我一直在和FTDI讨论这个问题,最近他们发布了一个新的应用说明:

它使用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地狱的体验…

什么版本的Windows是.Net 4.0所必需的?目前我使用的是2.0,这意味着我的应用程序将在Windows 98或2000下运行,但我不确定有多少最终用户仍在运行此类系统。NET 4.0需要Windows XP SP3。能否提供有关您用于测试XP、Vista或Win7的操作系统的信息?谢谢您的回复。如果我有时间,我会调查的。我一直在使用一个单独的ap来处理端口连接,虽然这种方法让人感到难以置信的恶心,但它已经足够好了,没有任何改变的主要动力。当然很高兴知道未来的项目,尽管.NP。我一直想在某个地方写一篇关于这一切的博客文章,以供将来的人们参考,所以我可以提供更多的帮助,但是现在的代码太乱了。。。