首页 > 代码库 > 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应用程序自动探测串口号
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。