USB拔出时COM端口消失这意味着我需要支持在应用程序在平板电脑上运行时插拔USB连接器的功能。平板电脑运行一个c#应用程序(Win764位上的.net4.5),我将连接到ArduinoUno。启动应用程序时,我循环使用所有可用的COM端口:varports=SerialPort.GetPortNames();//->[COM3,COM4,??COM8]foreach(varportinports){varserial=newSerialPort(portname,baudRate);//attempthandshakeandconnecttorightport}这工作正常,但如果我拔下并重新插入USB电缆并重新尝试重新连接到Arduino(当应用程序仍在运行时),Arduino端口(COM8)不再列在:SerialPort.GetPortNames();//->[COM3,COM4]而没有COM8即使重新启动应用程序(重新插入Arduino)也会导致仅列出[COM3,COM4]。让它恢复工作的唯一方法是在应用程序未运行时拔下并重新插入Arduino。令我困惑的是,当我在启动应用程序后插入ArduinoUno时,SerialClass识别新添加的端口并允许我连接。只有在应用程序运行时拔下并重新插入设备时才会出现此问题。似乎尽管能够重置COM端口(在代码中或在设备管理器中手动重置),但SerialClass(和本机Win32_SerialPort-我也检查过)无法识别这一点,除非我重新启动应用程序可能是什么原因?如何确保我的应用程序可以重新连接到该端口?还有其他方法可以使用SerialPort来处理USB连接器吗?我找到了一个处理插拔的解决方案。首先,它需要使用SafeSerialPort,它允许您正确配置串口。安全串口串口;privatevoidConnect(){字符串端口名="COM8";serialPort=newSafeSerialPort(端口名,9600);serialPort.DataReceived+=port_DataReceived;串行端口.Open();其次,需要使用LibUsbDotNet来检测USB设备是否连接或断开。这将允许您确定是连接到设备还是重置COM端口。公共USB设备MyUsb设备;//通过列出所有可用的USB设备找到您的供应商ID等publicUsbDeviceFinderMyUsbFinder=newUsbDeviceFinder(0x2341,0x0001);publicIDeviceNotifierUsbDeviceNotifier=DeviceNotifier.OpenDeviceNotifier();privatevoidOnDeviceNotifyEvent(objectsender,DeviceNotifyEventArgse){if(e.Object.ToString().Split('n')[1].Contains("0x2341")){if(e.EventType==EventType.DeviceArrival){连接();}elseif(e.EventType==EventType.DeviceRemoveComplete){ResetConnection();最后,处理SerialPort将确保它在Windows中的HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM中注册,这意味着SerialPort.GetPortNames()可以重新检测端口。privatevoidResetConnection(){try{//发送任何数据导致IOExceptionserialPort.Write("Anyvalue");}catch(IOExceptionex){//处理SafeSerialPortserialPort.Dispose();串行端口.关闭();}}完成此过程后,您可以在连接USB设备的同时重新连接到COM端口,而无需重新启动应用程序。完整代码:使用LibUsbDotNet;使用LibUsbDotNet.DeviceNotify;使用LibUsbDotNet.Info;使用LibUsbDotNet.Main;安全串口串口;公共SerialPortTest(){连接();UsbDeviceNotifier.OnDeviceNotify+=OnDeviceNotifyEvent;}privatevoidConnect(){字符串端口名="COM8";serialPort=newSafeSerialPort(端口名,9600);serialPort.DataReceived+=port_DataReceived;串行端口.Open();}privatevoidResetConnection(){try{serialPort.Write("任何值");}catch(IOExceptionex){serialPort.Dispose();串行端口.关闭();}}voidport_DataReceived(objectsender,SerialDataReceivedEventArgse){Console.WriteLine(serialPort.ReadExisting());}公共UsbDeviceMyUsbDevice;//通过枚举USB设备可以找到VendorID等publicUsbDeviceFinderMyUsbFinder=newUsbDeviceFinder(0x2341,0x0001);publicIDeviceNotifierUsbDeviceNotifier=DeviceNotifier.OpenDeviceNotifier();私人无效OnDeviceNotifyEvent(对象发件人,DeviceNotifyEventArgse){//如果这是你的USB设备,在我的例子中是Arduinoif(e.Object.ToString().Split('n')[1].Contains("0x2341")){if(e.EventType==EventType.DeviceArrival){连接();}else{ResetConnection();所以我相信这是因为当有人第一次插入时你的程序正在缓存USB的地址当设备连接时,集线器检测到D+或D-上的电压并发送信号到主机通过这个中断端点。当主机轮询此中断端点时,它会收到新设备存在的通知。然后它指示集线器(通过默认控制管道)重置插入新设备的端口。***此重置导致新设备采用地址0,主机可以直接与之交互;此交互将导致主机为设备分配一个新的(非零)地址。最好的办法是研究如何以编程方式刷新USB设备的地址缓存。参考:http://en.wikipedia.org/wiki/USB_hub以上是C#学习教程:USB拔掉后,COM口消失所有分享的内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
