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);

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

 

posted on 2016-09-26 10:31  程序天空下的骆驼  阅读(1965)  评论(1编辑  收藏  举报

导航