以下C# WMI範例程式code為參考自下方網路論壇資料並進行相關實作實驗,並加上自己的備忘註解:
(1) https://hant-kb.kutu66.com/windows/post_650386
(2) https://stackoverflow.com/questions/17563969/wmi-usb-monitor-multiple-events-fired?rq=1
(3) https://social.msdn.microsoft.com/Forums/zh-TW/c236cac4-a954-4a70-882d-bc20e2cc6e81/getting-more-information-about-a-serial-port-in-c?forum=winformsdesigner
(4) https://stackoverflow.com/questions/2837985/getting-serial-port-information/59508646#59508646
(5) https://cyfangnotepad.blogspot.com/2015/01/cnet-usb.html
個人本身不是什麼純軟體物件導向語言高手,只是過去有一些短暫的相關開發經驗,分享出來讓大家作個參考
程式執行(實驗)環境為Visual Studio IDE, 平台為.NET Framework
.
- 第一部分:主要是記錄如何用C#語言撰寫偵測USB裝置的insert/remove狀態事件
using System.Management;
//...
ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 1");
//EventType = 1是對insert和remove都有反應;
//EventType = 2是只有對insert有反應;
//EventType = 3是只有對remove有反應
//以上可以視情況宣告為全域instances 方便一些應用
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Query = query;
watcher.Start();
//如果要停掉watcher就呼叫watcher.Stop(); 不用時可以dispose()掉
//注意上述這些初始動作要在serial port init之前
static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
... //看你想在
EventHandler函式裡面做什麼應用}
------------------------------------
- 第二部分:主要是記錄如何用C#語言撰寫取得裝置管理員內的COM PORT裝置名稱,這邊以Prolific的PL2303 UART轉USB晶片的裝置為例合基本邏輯撰寫(這是許多人玩Raspberry pi或Arduino常會用到的UART/USB轉換的線材內的常見晶片,另外幾款這類用途的常見晶片就是CP210x、CH340、FT232R,不清楚這方面的朋友可參考小弟過去寫的這兩篇文章: USB_to_Serial轉換器或轉換線或轉換板 和 安裝PL2303 USB to Serial轉換線之驅動程式)
using System.Management;
//...
public string GetFullComputerDevices()
{
ManagementClass processClass = new ManagementClass("Win32_PnPEntity");
ManagementObjectCollection Ports = processClass.GetInstances();
string ComPort_number = "No COM Port device recognized";
foreach(ManagementObject property in Ports)
{
if (property.GetPropertyValue("Name").ToString().Contains("Prolific USB-to-Serial Comm Port"); //以顯示名稱為Prolific USB-to-Serial Comm Port的UART轉USB晶片PL2303為基底的裝置為例
{
ComPort_number = property.GetPropertyValue("Name").ToString();
ComPort_number = ComPort_number.Substring(ComPort_number.IndexOf("COM")).TrimEnd(')'); //取得COMx的字串並將其放置到ComPort_number這個string變數
//微軟的String.Substring方法教學
//微軟的String.TrimEnd方法教學:
}
}
return ComPort_number; //回傳字串,如果都沒有就會回傳預設的"No COM Port device recognized"字串
}
注意! 除了在程式裡面using System.Management之外,還有一個步驟要做,否則會有錯誤: 專案 -> 加入參考參考管理員 -> 組件 -> 右上角搜尋: management -> 勾選System.Management -> 按下確定
(如果Visual Studio是英文版: project -> Add Reference -> Reference Manager -> Assemblies -> search: System.Management -> choose(tick): System.Management -> press Enter)
最後,簡單利用上述重點,並搭配C#的一些基礎
整合實作一個簡單的PL2303的USB轉UART線裝置的插拔偵測與取得裝置名稱的應用程式
Demo影片如下:
(註解: GUI視窗程式下方淺藍色圖案只是一個測試效果)
程式背景圖片就用張西子灣照吧!
【若需要家教模式之技術輔導 可來信洽談合作方式: iws6645@gmail.com】