获取系统当前可用串口的两种方法

进行串口通信之前,需要获取当前系统的可用串口。要想达到此目的,有两种方式,读取注册表和使用CreateFile函数轮询读取串口。

1.使用CreateFile轮询读取串口:

 1 UINT CComDebugToolDlg::GetSerialPortState()
 2 {
 3      CString strCom;
 4     int nCom=0;
 5     HANDLE hCom;
 6     
 7     do 
 8     {
 9         nCom++;
10         strCom.Format("COM%d",nCom);
11     
12         hCom=CreateFile(strCom,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,0);//轮询打开串口
13         if (INVALID_HANDLE_VALUE==hCom)
14         {
15             DWORD err=::GetLastError();
16         }
17         else
18         {
19             m_comCbx.AddString(strCom);
20         }
21         CloseHandle(hCom);//关闭串口
22     } while (nCom<256);
23     m_comCbx.SetCurSel(0);
24     return 0;       
25 }

2.读取注册表

 1 UINT CComDebugToolDlg::GetSerialPortState()
 2 {
 3     LPCTSTR strReg="HARDWARE\\DEVICEMAP\\SERIALCOMM";
 4     HKEY hKey;
 5     CString strSerialPortList[256];
 6     int i=0;
 7     
 8     long ret=0;
 9     DWORD dwIndex=0;
10     char name[25]={0};
11     DWORD dwName;
12     DWORD dwType;
13     UCHAR szPortName[25]={0};
14     DWORD szPortNameOfBytes=sizeof(szPortName);
15     
16     ret=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,strReg,0,KEY_READ,&hKey);
17     if (ret!=ERROR_SUCCESS)
18     {
19         return -1;
20     } 
21     
22     do 
23     {
24         ret=RegEnumValue(hKey,dwIndex++,name,&dwName,NULL,&dwType,szPortName,&szPortNameOfBytes);
25         if (ret==ERROR_SUCCESS||ret==ERROR_MORE_DATA)
26         {
27             strSerialPortList[i]=(CString)szPortName;
28             m_comCbx.AddString(strSerialPortList[i]);
29             i++;
30         }
31 
32     } while (ret=ERROR_SUCCESS||ret==ERROR_MORE_DATA);
33     RegCloseKey(hKey);
34 
35     m_comCbx.SetCurSel(0);
36 
37     return 0;
38 }

 

posted @ 2017-11-30 14:12  夜雨翛然  阅读(2849)  评论(0编辑  收藏  举报