在串列埠通訊開發中實現自動查詢串列埠埠的方法

2021-07-04 09:56:58 字數 3445 閱讀 7140

開發工具:visual studio 2010

本機可用串列埠資訊如下:

1 、查詢登錄檔 

查詢登錄檔的方法是比較常見的方法,通過檢視「 hkey_local_machine\hardware\devicemap\serialcomm 」項來獲取串列埠資訊。該方法就是使用程式設計方法讀取登錄檔內資訊,相當於使用者通過在執行框內輸入 」regedit」 (或 regedit32 )直接開啟登錄檔。源**如下:

int i = 0; 

char name[25]; 

uchar szportname[25]; 

long status; 

dword dwindex = 0; 

dword dwname; 

dword dwsizeofportname; 

dword type;

hkey hkey; 

cstring   strseriallist[256];  // 臨時定義 256 個字串組,因為系統最多也就 256 個 

lpctstr data_set="hardware\\devicemap\\serialcomm\\";

dwname = sizeof(name); 

dwsizeofportname = sizeof(szportname);

//long ret0 = (::regopenkeyex(hkey_local_machine, data_set, 0, key_read, &hkey)); 

long ret0 = regopenkeyex(hkey_local_machine, data_set, 0, key_read, &hkey); //開啟乙個制定的登錄檔鍵,成功返回error_success即「0」值

if(ret0 == error_success) 

//每讀取一次

dwname

和dwsizeofportname

都會被修改 

//注意一定要重置,否則會出現很離奇的錯誤,本人就試過因沒有重置,出現先插入串口號大的(如com4),再插入串口號小的(如com3),此時雖能發現兩個串列埠,但都是同一串口號(com4)的問題,同時也讀不了com大於10以上的串列埠 

dwname = sizeof(name); 

dwsizeofportname = sizeof(szportname); 

} while((status == error_success)||(status == error_more_data)); 

regclosekey(hkey);  }

除錯輸出資訊如下:

該方法在 1ms內即可完成查詢;同時也可解決 usb 轉串列埠裝置的問題,比較實用,唯一缺點是,如果使用者在裝某些軟硬體時在登錄檔中註冊了虛擬串列埠之類的,用此法列舉得到的該類串列埠實際上是不能當串列埠用的。 

2、使用 setupapi 函式集的方法

此種方法是最簡單的方法,之所以簡單是因為已經有人將複雜的**封裝起來了,只需像傻子一樣呼叫就可以完成工作了,具體的說明請看

,使用該方法要在你的程式中,新增「 enumserial.cpp 」和「 enumserial.h 」兩個檔案,並且將 setupapi.lib 包含進你的工程,方法在專案屬性-配置屬性-聯結器-輸入-附加依賴項中新增setupapi.lib,然後在enumserial.cpp中新增包含"setupapi.h" ,你的應用程式新增包含enumserial.h標頭檔案就行了,

下面給出呼叫該方法的例子**:

int m_nserialportnum(0);// 串列埠計數 

cstring          strseriallist[256];  // 臨時定義 256 個字串組 

carray asi; 

enumserialports(asi,true);// 引數為 true 時列舉當前可以開啟的串列埠, 

// 否則列舉所有串列埠 

m_nserialportnum = asi.getsize(); 

for (int i=0; i

除錯輸出資訊如下:

該方法查詢乙個串列埠就要 15ms 左右,但可以看到該方法獲取的串列埠完完全全就是硬體裝置管理器中的串列埠。

3、使用 enumport 方法

該方法呼叫 enumport () api 函式,該函式本身就是列舉電腦埠用的,它列舉的並非只有串列埠,所以必須對其所得串列埠進行分析選擇,使用這種方法要在原始碼中新增#include 標頭檔案

以下是源**:

int i=0;

int m_nserialportnum(0);// 串列埠計數 

cstring          strseriallist[256];  // 臨時定義 256 個字串組 

lpbyte pbite  = null; 

dword pcbneeded = 0;  // bytes received or required 

dword pcreturned = 0;  // number of ports received 

m_nserialportnum = 0;

// 獲取埠資訊,能得到埠資訊的大小 pcbneeded 

enumports(null, 2, pbite, 0, &pcbneeded, &pcreturned); 

pbite = new byte[pcbneeded]; 

// 列舉埠,能得到埠的具體資訊 pbite 以及埠的的個數 pcreturned

enumports(null, 2, pbite, pcbneeded, &pcbneeded, &pcreturned); 

port_info_2 *pport; 

pport = (port_info_2*)pbite; 

for ( i = 0; i < pcreturned; i++)  }

除錯輸出資訊如下:

可以看出該方法除了串列埠,還可以列舉所有的並口和印表機等介面,而且能找到虛擬串列埠(這些串列埠有些未使用時,在登錄檔和硬體裝置管理器中是不能取得的)。但是該方法稍微耗時些,大概需要幾十 ms ,主要問題是該方法有些 usb 串列埠並不能查到,系統中沒有的串列埠它都例出來了,所以該方法並不可靠。

4、依次開啟串列埠的方法

該方法就是中規中矩的依次開啟串列埠,看開啟是否成功來判斷串列埠的有無,一般查詢乙個串列埠就要 15ms 左右

以上方法個人覺得可取的是第

一、二種方法。最可靠的是第二種方法。

在串列埠通訊開發中實現自動查詢串列埠埠的方法

開發工具 visual studio 2010 本機可用串列埠資訊如下 1 查詢登錄檔 查詢登錄檔的方法是比較常見的方法,通過檢視 hkey local machine hardware devicemap serialcomm 項來獲取串列埠資訊。該方法就是使用程式設計方法讀取登錄檔內資訊,相當於...

在串列埠通訊開發中實現自動查詢串列埠埠的方法

開發工具 visual studio 2010 本機可用串列埠資訊如下 1 查詢登錄檔 查詢登錄檔的方法是比較常見的方法,通過檢視 hkey local machine hardware devicemap serialcomm 項來獲取串列埠資訊。該方法就是使用程式設計方法讀取登錄檔內資訊,相當於...

在串列埠通訊開發中實現自動查詢串列埠埠的方法

開發工具 visual studio 2010 本機可用串列埠資訊如下 1 查詢登錄檔 查詢登錄檔的方法是比較常見的方法,通過檢視 hkey local machine hardware devicemap serialcomm 項來獲取串列埠資訊。該方法就是使用程式設計方法讀取登錄檔內資訊,相當於...