自動獲取串口端口號(C#實現)


  問題描述:串口線松動或者其他原因導致串口通信中斷時,需要打開設備管理器查看端口號,然后在軟件中重新選擇端口號建立連接,這個過程比較麻煩。

  解決辦法:使用Win32_PnPEntity WMI類來自動獲取設備管理器中的串口端口號,在打開軟件時,自動獲取需要的端口號,打開串口建立通信連接。Win32_PnPEntity WMI類表示即插即用設備的屬性,即插即用實體在控制面板的“設備管理器”中顯示為條目。

  局限性:只適用於PC只有一個串口或者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 /// <summary>
 2 /// 自動獲取串口的端口號
 3 /// </summary>
 4 /// <returns>COM號</returns>
 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處得不到自己想要的結果。
 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM