2010-09-10 74 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