總網頁瀏覽量

顯示具有 application programs 標籤的文章。 顯示所有文章
顯示具有 application programs 標籤的文章。 顯示所有文章

2020年3月18日 星期三

【C# 應用程式】透過WMI API偵測COM Port裝置插拔狀態及取得裝置名稱的重點程式筆記(參考國外網路上網友分享的程式碼)


以下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】
 

2019年3月20日 星期三

安裝Visual Studio 2017




近期為了一些需求,可能要學習C++ MFC及C#,所以紀錄架設開發環境的過程於此,這邊所使用的pc環境是x86 64bits windows7

1.      下載Visual Studio 2017

下載完後,如果你尚未安裝.NET Framework 4.6以上的套件,點擊Visual Studio 2017安裝程式時會看到提醒視窗跳出,無法進行安裝



所以需要先下載並安裝   .NET Framework 4.6




.NET Framework 4.6安裝完成後,再次進行Visual Studio 2017安裝程式,就可以順利安裝


2.      執行Visual Studio 2017安裝程式

進入安裝程式後,首先會看到一段初始步驟的畫面

之後進入到安裝程式選擇畫面,安裝程式會請使用者選擇希望安裝的環境套件,可於右方看到您所安裝的環境工具套件(亦有細項可選擇),以及您所選擇的套件其所占空間會顯示於右下角,並可選擇全部的東西都下載到您pc後再安裝或者下載時邊安裝。


選擇完成後之後就點選安裝

安裝完成後會有提醒視窗跳出,說明須重新啟動電腦,才能啟動Visual Studio 2017



另外微軟本身就有提供不少說明文件供參考:

使用 Visual Studio IDE 進行 C++ 桌面程式開發:

Visual Studio 中的 Visual C++:

Visual Studio 中的 C++ 使用者入門: