sup*_*cat 3 vb.net usb serial-port
我有一个应用程序,它应该与多个自定义设备通信,其中一些使用FTDI USB到串行转换器芯片,其中一些使用TCP.应用程序需要能够随时接受来自可能随时插入或拔出的设备的数据; 该应用程序充当设备和数据库之间的桥梁.
似乎当设备被拔出时,它通常会导致SerialPort类在BackgroundWorker线程中抛出异常并使应用程序崩溃.
我目前的补救措施,可能是荒谬的复杂,是让一个帮助应用程序发送/接收串行端口数据并将其中继到TCP套接字/从TCP套接字中继.当我的主应用程序看到插入了USB设备时,它会启动另一个应用程序,然后使用TCP套接字与之通信.如果插入了多个USB设备,则将为每个设备启动一个单独的帮助应用程序实例.当拔出USB端口时,帮助应用程序将崩溃,但"意外关闭"消息将被扼杀.
这种方法有效,但似乎大都不满意.必须有一个更好的方法.
我遇到了与.NET 2.0相同的问题,我又回到了使用FTDI dll包装器:http: //www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp/FTD2XX_NET_1010.zip
工作得很好,您可以访问控制驱动程序的真正好处,例如以编程方式设置延迟计时器.
我写了一个自己的类,通过在尝试读取数据时捕获FT_IO_ERROR事件来检测unplug事件.通过捕获错误并声称它是一个拔出插头,这并不完全令人满意.但它的确有效.
我一直在和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地狱经历....