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

你可能感兴趣的:(自动获取串口端口号(C#实现))