使用C#編程很多年了,大部分功能都是基于串口來開發(fā)的,畢竟串口也是面對下位機硬件調(diào)試中最為簡便的方法。
不過,如果系統(tǒng)中有多個串口的時候,就會遇到一定的麻煩,比如我的電腦設備中就存在多個串口:
我早先時候,習慣使用IO.Ports命名空間的API來獲取端口信息,就像下面這段代碼
Int32 port_name_len = System.IO.Ports.SerialPort.GetPortNames().Length;
cbBoxCom.Items.Clear();//清空下拉列表
if (port_name_len != 0)//系統(tǒng)當前存在的端口加入列表
{
for(int i = 0; i < port_name_len;i++)
Trace.WriteLine(System.IO.Ports.SerialPort.GetPortNames()[i]);
foreach (string com in System.IO.Ports.SerialPort.GetPortNames())
{
cbBoxCom.Items.Add(com);
}
cbBoxCom.SelectedIndex = 0; // 選中列表中的第一個端口
}
else
{
MessageBox.Show("沒有檢測到設備,請插入設備重新啟動。");
cbBoxCom.Items.Add("no port");
}
這樣獲取串口端口號的問題在于,我們只能夠獲取到COM1,COM2這樣的字符串,即便我們實現(xiàn)了動態(tài)插入監(jiān)測,最終在我們界面中的選項列表里,也只能展示出一堆COM口,想接收和發(fā)送信息的時候也不知道該打開哪一個。
因此,比較好的辦法是去拉去COM口的更詳細的信息,比如我們把第一張圖中的JLink CDC UART Port也拉去出來,顯示在端口列表中,這樣我們就比較容易分辨出改選用哪個端口了。
下面是具體的方法:
try
{
// 定義查詢 WMI 的語句
string query = "SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(COM%'";
// 使用 ManagementObjectSearcher 查詢設備
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
foreach (ManagementObject obj in searcher.Get())
{
// 獲取設備描述
string name = obj["Name"]?.ToString() ?? "未知設備";
string manufacturer = obj["Manufacturer"]?.ToString() ?? "未知廠商";
cBoxComNum.Items.Add(GetComx(name));
//Trace.WriteLine($"設備描述: {name}");
//Trace.WriteLine($"廠商: {manufacturer}");
//Trace.WriteLine(new string('-', 50));
}
}
AdjustDropDownWidth(cBoxComNum);
cBoxComNum.SelectedIndex = 0; //選中第一個
cBoxBaudrate.Items.Add(115200);
cBoxBaudrate.Items.Add(9600);
}
catch (Exception ex)
{
Trace.WriteLine($"發(fā)生錯誤: {ex.Message}");
}
從上面的代碼可以看出,我們還可以獲取到廠商信息,這樣可以進一步對串口進行區(qū)分,進一步有效地區(qū)分串口,避免每次都要嘗試,或者反復插拔串口設備。
效果還可以,要想?yún)^(qū)分同一個品牌的同一個型號,還需要研究研究。