MFC下自动识别串口的实现

时间:2022-01-20 06:07:41

摘自:http://blog.csdn.net/itas109/article/details/18359295

程序:http://blog.csdn.net/itas109/article/details/18359295

serial类里边的两个函数

[cpp]  view plain  copy
  1. void CSerialPort::Hkey2ComboBox(CComboBox& m_PortNO)  
  2. {  
  3.     HKEY hTestKey;  
  4.     bool Flag = FALSE;  
  5.       
  6.     ///仅是XP系统的注册表位置,其他系统根据实际情况做修改  
  7.     if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hTestKey) ){  
  8.         QueryKey(hTestKey);  
  9.     }  
  10.     RegCloseKey(hTestKey);  
  11.       
  12.     int i = 0;  
  13.     m_PortNO.ResetContent();///刷新时,清空下拉列表内容  
  14.     while(i < MaxSerialPortNum && -1 != m_nComArray[i]){  
  15.         CString szCom;   
  16.         szCom.Format(_T("COM%d"), m_nComArray[i]);  
  17.         m_PortNO.InsertString(i, szCom.GetBuffer(5));  
  18.         ++i;  
  19.         Flag = TRUE;  
  20.         if (Flag)///把第一个发现的串口设为下拉列表的默认值  
  21.             m_PortNO.SetCurSel(0);  
  22.     }  
  23.       
  24. }  
[cpp]  view plain  copy
  1. ///查询注册表的串口号,将值存于数组中  
  2. ///本代码参考于mingojiang的获取串口逻辑名代码  
  3. //  
  4. void CSerialPort::QueryKey(HKEY hKey)   
  5. {   
  6.     #define MAX_KEY_LENGTH 255  
  7.     #define MAX_VALUE_NAME 16383  
  8.     //  TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name  
  9.     //  DWORD    cbName;                   // size of name string   
  10.     TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name   
  11.     DWORD    cchClassName = MAX_PATH;  // size of class string   
  12.     DWORD    cSubKeys=0;               // number of subkeys   
  13.     DWORD    cbMaxSubKey;              // longest subkey size   
  14.     DWORD    cchMaxClass;              // longest class string   
  15.     DWORD    cValues;              // number of values for key   
  16.     DWORD    cchMaxValue;          // longest value name   
  17.     DWORD    cbMaxValueData;       // longest value data   
  18.     DWORD    cbSecurityDescriptor; // size of security descriptor   
  19.     FILETIME ftLastWriteTime;      // last write time   
  20.       
  21.     DWORD i, retCode;   
  22.       
  23.     TCHAR  achValue[MAX_VALUE_NAME];   
  24.     DWORD cchValue = MAX_VALUE_NAME;   
  25.       
  26.     // Get the class name and the value count.   
  27.     retCode = RegQueryInfoKey(  
  28.         hKey,                    // key handle   
  29.         achClass,                // buffer for class name   
  30.         &cchClassName,           // size of class string   
  31.         NULL,                    // reserved   
  32.         &cSubKeys,               // number of subkeys   
  33.         &cbMaxSubKey,            // longest subkey size   
  34.         &cchMaxClass,            // longest class string   
  35.         &cValues,                // number of values for this key   
  36.         &cchMaxValue,            // longest value name   
  37.         &cbMaxValueData,         // longest value data   
  38.         &cbSecurityDescriptor,   // security descriptor   
  39.         &ftLastWriteTime);       // last write time   
  40.       
  41.     for (i=0;i<20;i++)///存放串口号的数组初始化  
  42.     {  
  43.         m_nComArray[i] = -1;  
  44.     }  
  45.       
  46.     // Enumerate the key values.   
  47.     if (cValues > 0) {  
  48.         for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) {   
  49.             cchValue = MAX_VALUE_NAME;  achValue[0] = '\0';   
  50.             if (ERROR_SUCCESS == RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL))  {   
  51.                 CString szName(achValue);  
  52. //              if (-1 != szName.Find(_T("Serial")) || -1 != szName.Find(_T("VCom")) ){  
  53.                 if (-1 != szName.Find(_T("Serial")) || -1 != szName.Find(_T("VCom")) || -1 != szName.Find(_T("Silabser"))){  
  54.                     BYTE strDSName[10]; memset(strDSName, 0, 10);  
  55.                     DWORD nValueType = 0, nBuffLen = 10;  
  56.                     if (ERROR_SUCCESS == RegQueryValueEx(hKey, (LPCTSTR)achValue, NULL, &nValueType, strDSName, &nBuffLen)){  
  57.                         int nIndex = -1;  
  58.                         while(++nIndex < MaxSerialPortNum){  
  59.                             if (-1 == m_nComArray[nIndex]) {  
  60.                                 m_nComArray[nIndex] = atoi((char*)(strDSName + 3));  
  61.                                 break;  
  62.                             }  
  63.                         }  
  64.                     }  
  65.                 }  
  66.             }   
  67.         }  
  68.     }  
  69.     else{  
  70.         AfxMessageBox(_T("本机没有串口....."));  
  71.     }  
  72.       
  73. }