自动获取串口端口号(C#实现)

【自动获取串口端口号(C#实现)】问题描述:串口线松动或者其他原因导致串口通信中断时,需要打开设备管理器查看端口号,然后在软件中重新选择端口号建立连接,这个过程比较麻烦。
解决办法:使用Win32_PnPEntity WMI类来自动获取设备管理器中的串口端口号,在打开软件时,通过自动获取需要的端口号,打开串口建立通信连接。Win32_PnPEntity WMI类表示即插即用设备的属性,即插即用实体在控制面板的“设备管理器”中显示为条目。
局限性:只适用于PC上只有一个USB串口或者USB转串口的情况。如果同时有多个USB转串口或者USB串口,就没法很好地确定哪个端口号才是需要的端口号了。
例如设备管理器中有多个USB转串口:Prolific USB-to-Serial Comm Port (COM11)
Prolific USB-to-Serial Comm Port (COM12)
Prolific USB-to-Serial Comm Port (COM13)
本次串口通信中使用USB转串口来通信,且PC上只有一个USB转串口,实现代码如下:

1/// 2/// 自动获取串口的端口号 3/// 4/// COM号 5public string AutoGetCOM() 6{ 7List coms = new List(); 8 9try 10{ 11//搜索设备管理器中的所有条目 12using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity")) 13{ 14var hardInfos = searcher.Get(); 15foreach(var hardInfo in hardInfos) 16{ 17if (hardInfo.Properties["Name"].Value != null) 18{ 19if (hardInfo.Properties["Name"].Value.ToString().Contains("COM")) 20{ 21coms.Add(hardInfo.Properties["Name"].Value.ToString()); 22} 23} 24} 25searcher.Dispose(); 26} 27 28} 29catch 30{ 31return null; 32} 33 34string[] portNames = coms.ToArray(); 35foreach(string portName in portNames) 36{ 37if(portName.Contains("Prolific USB-to-Serial Comm Port")) 38{ 39return portName.Substring(portName.IndexOf('(') + 1,portName.IndexOf(')') - portName.IndexOf('(') - 1); 40} 41} 42return null; 43}

ManagementObjectSearcher类:此类是检索管理信息的常用入口点之一。 例如,它可用于枚举系统上的所有磁盘驱动器,网络适配器,进程和更多管理对象,或查询已启动的所有网络连接,暂停的服务等等。
实现过程中遇到的异常:System.Management.ManangementException: Invalid query
造成异常的原因是:query语句写错了
 ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from" + Win32_PnPEntity);
 注意:
1、有时候一直找不出异常原因,可以查看一下WMI服务器是否打开了。

2、if (hardInfo.Properties["Name"].Value != null) //操作之前先进行判空处理很有必要,不然操作空值会导致异常跑到catch处得不到自己想要的结果。





转载于:https://www.cnblogs.com/grebamboo/p/9993090.html

    推荐阅读