獲取系統當前可用串口的兩種方法


進行串口通信之前,需要獲取當前系統的可用串口。要想達到此目的,有兩種方式,讀取注冊表和使用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 }

 


免責聲明!

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



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