获取PC可用串口端口,并将其在combo box中显示

通常应用中,我会遇到需要用到多个串口的同时在一台PC上使用的情况,例如通过USB转串口等方式来硬件接入串口数目。

那么软件需要判断到底哪些串口号是可用的,才可以初始化相应的串口应用程序。

下面我们简单介绍一下,如何获取PC可用串口端口号,并将其显示在combo box控件中。

例程我们搜寻最多2个可用串口端口。

  1. 创建工程,在UI上添加如下控件:
  2. 因为我们需要用到两个串口,所以我们添加两个串口通信插件communications control(如果不需要操作串口,可不用).
  3. 添加按键事件处理函数 OnBnClickedStart 
  4. 函数处理:
    void CMicrohardTestDlg::OnBnClickedStart()
    {
        // TODO: Add your control notification handler code here
        int i;
        CMscomm1 *pMsc = (CMscomm1*)this->GetDlgItem(IDC_MSCOMM1);
        CComboBox *pcombo = (CComboBox*)this->GetDlgItem(IDC_COMBO1);
        switch (g_w_Steps)
        {
        case 0://check serial port by openning produrce.
        {
                   HANDLE hCom;
                   CString strCOM;;
                   m_Edit1_show = "";
                   pMsc->put_Settings(_T("115200,n,8,1"));
                   pcombo->ResetContent();//clear context
                   for (i = 0; i < 256; i++)
                   {
                       strCOM.Format(_T("COM%d"), i);
                       //open or Create a file or an I/O
                       hCom = CreateFile(_T("\\.\") + strCOM, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
                       if (hCom != INVALID_HANDLE_VALUE)
                       {
                           if (m_Edit1_show.IsEmpty())
                           {
                               pcombo->AddString(strCOM);
                               pcombo->SetCurSel(0);
                               pcombo = (CComboBox*)this->GetDlgItem(IDC_COMBO2);
                               m_Edit1_show = "PC Seral Ports Searching ...
    First Port was found.
    ";
                           }
                           else
                           {
                               pcombo->AddString(strCOM);
                               pcombo->SetCurSel(0);
                               m_Edit1_show += "Second Port was found.
    ";
                           }
                       }
                   }
                   if (m_Edit1_show.IsEmpty())
                   {
                       m_Edit1_show = "No PC Serial Port active.";
                   }
                   UpdateData(false);
                   g_w_Steps++;
                  break;
        }
        case 1:
        {
                  break;
        }
        default:
            break;
        }
    }
    OnBnClickedStart
  5. 这里主要函数为
    //open or Create a file or an I/O
     hCom = CreateFile(_T("\\.\") + strCOM, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
                       

    返回值不为 INVALID_HANDLE_VALUE 则说明串口端口可用。

  6. 到目前为止,我们活跃的串口已经打开了,但是我们并没有设置串口参数。那么我们需要先关有效的端口。更改后为:
    void CMicrohardTestDlg::OnBnClickedStart()
    {
        // TODO: Add your control notification handler code here
        int i,num;
        CString str,num_str;
        CMscomm1 *pMsc;
        CComboBox *pcombo;
        switch (g_w_Steps)
        {
        case 0://check serial port by openning produrce.
        {
                   //point to combo box1
                   pcombo = (CComboBox*)this->GetDlgItem(IDC_COMBO1);
                   //clear context
                   pcombo->ResetContent();
                   num = 0;
                   m_Edit1_show += _T("PC Serial Ports Searching ...
    ");
                   for (i = 0; i < 256; i++)
                   {
                       str.Format(_T("COM%d"), i);
                       //open or Create a file or an I/O
                       HANDLE hCom = CreateFile(_T("\\.\") + str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
                       if (hCom != INVALID_HANDLE_VALUE)
                       {
                           num++;
                           pcombo->AddString(str);
                           pcombo->SetCurSel(0);
                           //point to combo box2
                           pcombo = (CComboBox*)this->GetDlgItem(IDC_COMBO2);
                           m_Edit1_show += str + _T(" was found.
    ");
                       }
                       CloseHandle(hCom);
                       if (num >= 2)break;
                   }
                   if (num >= 2)
                   {
                       SetDlgItemText(IDC_BUTTON1, _T("OpenPorts"));
                       g_w_Steps++;
                   }
                   else
                   {
                       str.Format(_T("%d Port are active, we need at least 2 Port Active.Please re-try.
    "), num);
                       m_Edit1_show += str;
                   }
                   UpdateData(false);
                  break;
        }
        case 1:
        {
                  pMsc = (CMscomm1*)this->GetDlgItem(IDC_MSCOMM1);
                  pcombo = (CComboBox*)this->GetDlgItem(IDC_COMBO1);
                  //open 2 serial port
                  for (i = 0; i < 2; i++)
                  {
                      if (pMsc->get_PortOpen() == TRUE)
                      {
                          pMsc->put_PortOpen(FALSE);
                      }
                      //get combo box text--> str
                      pcombo->GetLBText(0, str);
                      //get str string num-->e.g "COM1235"==> num_str="1235"
                      num_str = str.Mid(3);
                      //get num from string num-->e.g "1235"==>num=1235
                      num = _ttoi(num_str);
                      pMsc->put_CommPort(num);
                      pMsc->put_Settings(_T("115200,n,8,1"));
                      pMsc->put_PortOpen(TRUE);
                      if (pMsc->get_PortOpen() == TRUE)
                      {
                          m_Edit1_show += str + _T(" was Opened Success. Configuration: 115200,n,8,1
    ");
                      }
                      pMsc = (CMscomm1*)this->GetDlgItem(IDC_MSCOMM2);
                      pcombo->EnableWindow(FALSE);
                      pcombo = (CComboBox*)this->GetDlgItem(IDC_COMBO2);
                  }
                  SetDlgItemText(IDC_BUTTON1, _T("Login"));
                  UpdateData(false);
                  g_w_Steps++;
                  break;
        }
        case 2:
        {
                  m_Edit1_show += _T("");
                  break;
        }
        default:
            break;
        }
    }
    OnBnClickedStart

    这里我们调用 CloseHandle(hCom); 来关闭相应的端口。

谢谢。

End.

原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/12970745.html