zoukankan      html  css  js  c++  java
  • 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!
    "));
    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!
    "));
    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!
    "));
    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);

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

  • 相关阅读:
    webapi Action中跳转到指定内容
    命令行添加防火墙入站规则
    nps简单配置(linux环境)
    C# 执行Javascript脚本
    Docker集群管理(Docker Swarm)
    linux简单的部署frp
    QMap只有insert,而没有append
    SqlServer 数据发布与订阅时一个小问题的处理
    Vue 内部指令缩写
    html中ol li和ul li的区别
  • 原文地址:https://www.cnblogs.com/codecamel/p/5908202.html
Copyright © 2011-2022 走看看