開發(fā)工具:visual studio 2010 ![]() 1 、查詢注冊表
\************************************************************************/ RegCloseKey(hKey); return szTotalSerial; ![]() 可以看到,從注冊表中讀出了COM3,但是COM3在設(shè)備管理器中是不存在的,所以用這種方法有誤判可能性。該方法在 1ms內(nèi)即可完成查找;同時(shí)也可解決 usb 轉(zhuǎn)串口設(shè)備的問題,比較實(shí)用,唯一缺點(diǎn)是,如果用戶在裝某些軟硬件時(shí)在注冊表中注冊了虛擬串口之類的,用此法枚舉得到的該類串口實(shí)際上是不能當(dāng)串口用的,如本例中的COM3。
2、使用 SetupAPI 函數(shù)集的方法
此種方法是最簡單的方法,之所以簡單是因?yàn)橐呀?jīng)有人將復(fù)雜的代碼封裝起來了,只需像傻子一樣調(diào)用就可以完成工作了,具體的說明請(qǐng)看 http://www./Cpp/W-P/system/hardwareinformation/article.php/c5721/ ,使用該方法要在你的程序中,添加“ EnumSerial.cpp ”和“ EnumSerial.h ”兩個(gè)文件,并且將 Setupapi.lib 包含進(jìn)你的工程,方法在項(xiàng)目屬性-配置屬性-連接器-輸入-附加依賴項(xiàng)中添加setupapi.lib,然后在EnumSerial.cpp中添加包含"setupapi.h" ,你的應(yīng)用程序添加包含EnumSerial.h頭文件就行了, 下面給出調(diào)用該方法的例子代碼: /************************************************************************\ * 函數(shù)說明:獲取本機(jī)所有的串口。多個(gè)串口以“|”連接。 * 參數(shù)說明: * 返 回 值: * 注意事項(xiàng):此種方法是最簡單的方法,之所以簡單是因?yàn)橐呀?jīng)有人將復(fù)雜的代碼封裝起來了 ,只需像傻子一樣調(diào)用就可以完成工作了,具體的說明請(qǐng)看 http://www./Cpp/W-P/system/hardwareinformation/article.php/c5721/ , 使用該方法要在你的程序中,添加“ EnumSerial.cpp ”和“ EnumSerial.h ”兩個(gè)文件, 并且將 Setupapi.lib 包含進(jìn)你的工程,方法在項(xiàng)目屬性-配置屬性-連接器-輸入-附加依賴項(xiàng) 中添加setupapi.lib,然后在EnumSerial.cpp中添加包含"setupapi.h" ,你的應(yīng)用程序添 加包含EnumSerial.h頭文件就行了。本方法避免了用戶在裝某些軟硬件時(shí)在注冊表中注冊了 虛擬串口之類的東西引起的誤判。比如::經(jīng)測試,本機(jī)注冊表有串口COM3、COM5、COM6、COM12, 但通過設(shè)備管理器查看,只有COM5、COM6、COM12串口,沒有COM3,COM3可能是裝某些軟硬件時(shí)在注 冊表中注冊了虛擬串口之類的,如果采用讀注冊表即GetLocalSerial()方法,會(huì)將COM3也讀取到, 從而引起的誤判,但采用本方法時(shí)則不會(huì)引起誤判,即不會(huì)將COM3讀取出來。 * 編輯日期:2013-08-27 13:25:41 * 作 者:DanSir \************************************************************************/
wstring CSerialTools::GetlocalSerialEx() { CArray<SSerInfo,SSerInfo&> asi; // Populate the list of serial ports.
EnumSerialPorts(asi, FALSE/*include all*/); wstring szTotalSerial;
for (int ii=0; ii < asi.GetSize(); ii++) { // 注意:不能使用asi[ii].strPortName,當(dāng)串口存在時(shí),其為空(內(nèi)部代碼沒實(shí)現(xiàn)) CString strFriendlyName = asi[ii].strFriendlyName; int nIndexFirst = strFriendlyName.Find(_T("(")); int nIndexLast = strFriendlyName.ReverseFind(')'); if (-1 == nIndexLast || -1 == nIndexFirst) { continue; } CString strPortName = strFriendlyName.Mid(nIndexFirst + 1, nIndexLast - nIndexFirst - 1);
szTotalSerial += strPortName; // 串口字符串保存 szTotalSerial.append(_T("|")); } wstring::size_type nIndex = szTotalSerial.rfind(_T("|"));
if(wstring::npos != nIndex) { szTotalSerial = szTotalSerial.substr(0, nIndex); } return szTotalSerial;
} 界面顯示如下:
![]() 該方法查找一個(gè)串口就要 15ms 左右,但可以看到該方法獲取的串口完完全全就是硬件設(shè)備管理器中的串口。
|
|