獲取Windows系統中的串口


目的:獲取Windows系統中的所有可用和在用串口

方法:注冊表查詢法

優點:簡單、實用、快速、無遺漏,無多余結果。

說明:另外還有8種方法可以枚舉串口,但都不如此法。

代碼和詳細注釋如下:

//---------------------------------------------------------------------------
// 枚舉串口
void __fastcall TForm1::BtnEnumClick(TObject *Sender)
{
  // 清除信息提示區
  Memo1->Clear();

  // 清空串口列表, sg 是 TStringGrid 對象
  sg->Clear();
  sg->Cells[0][0] = L"串口物理名稱";
  sg->Cells[1][0] = L"串口邏輯名稱";  // 就是 COM1, COM2 之類的

  // 列標題居中對齊
  sg->Alignments[0][0] = taCenter;
  sg->Alignments[1][0] = taCenter;

  // 創建注冊表對象
  std::auto_ptr<TRegistry> Registry(new TRegistry(KEY_READ));
  
try { // 注冊表根路徑 Registry->RootKey = HKEY_LOCAL_MACHINE; // 打開串口設備所在的注冊表路徑 bool bResult = Registry->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM", false); // 若打開注冊表失敗,提示信息,直接返回 if (!bResult) { ShowHint("注冊表路徑不存在."); return; } // 數據項(名稱)列表,就是串口物理名稱列表 std::auto_ptr<TStringList> ItemNameList(new TStringList()); // 獲取數據項(名稱)列表,就是串口物理名稱列表 Registry->GetValueNames(ItemNameList.get()); // 單個數據項的名稱和值 (字符串形式),值的字符串形式就是串口邏輯名稱,就是COM1, COM2 之類的 UnicodeString sItemName, sItemValue; // 逐個獲取數據項值 (字符串形式) for (int i = 0; i < ItemNameList->Count; i++) { // 當前數據項名稱,也就是串口物理名稱 sItemName = ItemNameList->Strings[i]; // 讀取對應的數據項值 (字符串形式),也就是串口邏輯名稱 sItemValue = Registry->ReadString(sItemName); // 顯示串口物理名稱和串口邏輯名稱 //ShowHint(sItemName + "\t" + sItemValue); // sg 是 TStringGrid 對象 sg->Cells[0][i + 1] = sItemName; sg->Cells[1][i + 1] = sItemValue; sg->AutoSizeColumns(true, 0); } // 關閉會產生寫入操作 //Registry->CloseKey(); } // 在讀取注冊表時發生異常 catch(...) { ShowHint("在讀取注冊表時發生異常."); } } //---------------------------------------------------------------------------

 以下是程序運行結果:

說明1:若只想獲得可用(空閑)串口,還得逐個打開上述串口,成功打開的是可用(空閑)串口,否則為在用(被其它程序占用的)串口。

說明2:若要支持熱插拔串口,還需響應 WM_DEVICECHANGE 消息。

 

枚舉串口的各種方法對比

枚舉串口方法

說明

EnumPorts

能夠獲得歷史上曾經在系統中存在過的所有串口,不實用

WMI

無法獲取純粹用軟件虛擬出來的串口,例如VSPD串口

注冊表

簡便、實用、快速,無遺漏,無多余

SetupAPI

GUID_DEVINTERFACE_COMPORT

結果同注冊表法,但結果信息太詳細,能夠分辨出串口類型是純軟件虛擬的,還是藍牙虛擬的,還是USB虛擬的,等等。

SetupAPI

Ports Device   information set

結果同注冊表法,但結果信息太詳細,能夠分辨出串口類型是純軟件虛擬的,還是藍牙虛擬的,還是USB虛擬的,等等。

GetDefaultCommConfig

結果有遺漏

QueryDosDevice

結果同注冊表法,

文件讀寫法

結果同注冊表法,但要嘗遍255個串口,效率太低。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM