首页 > 代码库 > Visual studio C++ MFC应用程序自动探测串口号

Visual studio C++ MFC应用程序自动探测串口号

最近学习Visual studio C++的软件开发,做个串口工具,使用combo box下拉选项选择串口号,有两种方式,第一种自动添加串口号到工具代码中,比如常见的一些串口工具可以选择COM1~COM9的串口号,只需要在代码初始化的时候,加入串口号序列就可以,或者也可以在combo box属性菜单Data中添加“COM1;COM2;COM3;……COM9;”,此种办法在实际使用的时候,会比较麻烦,因为本来只有2个串口,却要在10来个序列中选择一个。

因此还有另外一种比较常见的处理方式,这种方式是在程序启动的时候自动探测系统当前有的串口号,然后将其串口号值加入到combo box控件当中,这样的话更加省事,但是代码要多写一些相关内容,通过百度,找到响应的代码。其运行效果如下,本人的计算机当前只有两个虚拟串口COM5和COM6

技术分享

具体代码如下

 1 BOOL CMFC_Uart20160921Dlg::CheckComPort(void) 2 { 3     long lReg; 4     HKEY hKey; 5     DWORD MaxValueLength; 6     DWORD dwValueNumber; 7     lReg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 8         0, KEY_QUERY_VALUE, &hKey); 9     if (lReg != ERROR_SUCCESS) //成功时返回ERROR_SUCCESS,10     {11         AfxMessageBox(TEXT("Open Registry Error!\n"));12         return FALSE;13     }14 15     lReg = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL,16         &dwValueNumber, &MaxValueLength, NULL, NULL, NULL);17 18     if (lReg != ERROR_SUCCESS) //没有成功19     {20         AfxMessageBox(TEXT("Getting Info Error!\n"));21         return FALSE;22     }23 24     TCHAR *pValueName, *pCOMNumber;25     DWORD cchValueName, dwValueSize = 10;26 27     for (int i = 0; i < dwValueNumber; i++)28     {29         cchValueName = MaxValueLength + 1;30         dwValueSize = 10;31         pValueName = (TCHAR*)VirtualAlloc(NULL, cchValueName, MEM_COMMIT, PAGE_READWRITE);32         lReg = RegEnumValue(hKey, i, pValueName,33             &cchValueName, NULL, NULL, NULL, NULL);34 35         if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))36         {37             AfxMessageBox(TEXT("Enum Registry Error or No More Items!\n"));38             return FALSE;39         }40 41         pCOMNumber = (TCHAR*)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE);42         lReg = RegQueryValueEx(hKey, pValueName, NULL,43             NULL, (LPBYTE)pCOMNumber, &dwValueSize);44 45         if (lReg != ERROR_SUCCESS)46         {47             AfxMessageBox(TEXT("Can not get the name of the port"));48             return FALSE;49         }50 51         CString str(pCOMNumber);52         //m_ComboComControl.AddString(str); //把获取的值加入到ComBox控件中53 54         VirtualFree(pValueName, 0, MEM_RELEASE);55         VirtualFree(pCOMNumber, 0, MEM_RELEASE);56     }57 58     return TRUE;59 60 }

 最后我们只要在初始化代码中执行上述函数,然后默认让combo box选择第一个串口就可以了

CheckComPort();
m_ComboComControl.SetCurSel(0);//让combo box的control控件选择第一个串口号

 

 

第一种办法是让combo box关联一个CString变量m_comboCom,然后再初始化函数OnInitDialog()中添加下列代码

 1 m_comboCom.AddString(_T("COM1")); 2     m_comboCom.AddString(_T("COM2")); 3     m_comboCom.AddString(_T("COM3")); 4     m_comboCom.AddString(_T("COM4")); 5     m_comboCom.AddString(_T("COM5")); 6     m_comboCom.AddString(_T("COM6")); 7     m_comboCom.AddString(_T("COM7")); 8     m_comboCom.AddString(_T("COM8")); 9     m_comboCom.AddString(_T("COM9"));10     m_comboCom.AddString(_T("COM10"));11     //m_comboCom.AddString(_T("COM11"));12     m_comboCom.SetCurSel(0);

或者使用控件的属性功能,如下图所示

技术分享

 

Visual studio C++ MFC应用程序自动探测串口号