2016年4月6日 星期三

取得Windows電腦上可用序列埠的名稱

最近要在Windows 10上寫一支程式, 其中有一個需求, 要取得目前可用的所有序列埠.
花了一些時間, 發現網路上大家都說, .Net Framework的SerialPort.GetPortNames 方法會傳回
許多重覆的序列埠名稱。例如:

COM1
COM12
COM12
COM5
COM5
COM5

除了會重覆外, 還有排序不對的問題。排序問題參考 [C#] 取得目前電腦所有可使用的序列埠(Serial Port)名稱 可以寫一段delegate的排序比較方法來解決。

同樣的, 重覆問題也可以用群組的方式, 寫一小段程式來解決。合在一起, 如下:

string[] ports = SerialPort.GetPortNames();  
List<string> listPorts = new List<string>(ports);  
   
Comparison<string> comparer = delegate (string name1, string name2)  
{  
   int port1 = Convert.ToInt32(name1.Remove(0,3));  
   int port2 = Convert.ToInt32(name2.Remove(0,3));  
   return (port1 - port2);  
};  
         
listPorts.Sort(comparer);  
   
string[] ComPorts = listPorts.ToArray();  
var result = ComPorts.GroupBy(a => a);  
   
ArrayList GroupPorts = new ArrayList();  
foreach (var group in result)  
{  
   GroupPorts.Add(group.Key);  
}  
   
cboPorts.Items.Clear();  
cboPorts.Items.AddRange(GroupPorts.ToArray());  

這樣,下拉選單的內容就會變成:
COM1
COM5
COM12
張貼留言