1、目前只在 win10 版本上验证过;
2、通过读取设备管理器端口方式添加串口;
3、可以添加一般串口、虚拟串口,同时解决端口名存在多个“()”的情形;
4、在全名和端口号添加方式中,均在端口号后增加一个“ ”,方便后续处理;
5、做了一个简易的冒泡排序,端口号做升序排序;
6、需要传入两个参数,全名添加 usefullName、升序排序 isSort;
public static string[] GetPortNames(bool usefullName = true, bool isSort = true)
{
List<string> result = new List<string>();
List<int> portNum = new List<int>();
//搜索设备管理器中所有的条目
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity"))
{
var hardInfos = searcher.Get();
foreach (var hardInfo in hardInfos)
{
if (hardInfo.Properties["Name"].Value != null)
{
string name = hardInfo.Properties["Name"].Value.ToString();
if (name.Contains("(COM") && name.EndsWith(")"))
{
string sName = name.Substring(0, name.IndexOf("COM") - 1);
string port = name.Replace(sName, "");
port = port.Substring(port.IndexOf("COM"), port.IndexOf(')') - 1);
if (name.Contains("->"))
{
string[] portPairTemp = port.Split(new string[] { "->" }, StringSplitOptions.None);
port = portPairTemp[0] + " -> " + portPairTemp[1];
}
if (usefullName)
{
result.Add(port + " " + sName);
}
else
{
result.Add(port + " ");
}
portNum.Add(Convert.ToInt32(result[result.Count - 1].Substring(3, result[result.Count - 1].IndexOf(" ") - 3)));
}
}
}
}
//port 口升序排序
if (isSort)
{
for (int i = 0; i < result.Count; i++)
{
for (int j = 0; j < result.Count - i - 1; j++)
{
if (portNum[j] > portNum[j + 1])
{
int tempPortNum = portNum[j];
portNum[j] = portNum[j + 1];
portNum[j + 1] = tempPortNum;
string resultTemp = result[j];
result[j] = result[j + 1];
result[j + 1] = resultTemp;
}
}
}
}
return result.ToArray();
}