zoukankan      html  css  js  c++  java
  • VC6.0 自动识别可用串口 添加至combox 并打开

    问题:

      使用VC6.0 自动识别可用串口 添加至combox 并打开。

    解答:

      1.新建COMMTEST3工程,添加一个combobox到界面,id设置为IDC_COMBO。

    (注意:组合框(ComboBox),运行时点击其右边的小箭头拉不下来(即不出现下拉列表)。需如下设置:
    这是使用VC++的人最初常遇到的问题,实际上是下拉列表的高度设置不当。组合框的高度是不能修改的,它是由系统决定的,但下拉部分的高度(即在下拉框中显示多少行)是可以设置的。在VB和Delphi中默认的高度是8行,但在VC++中默认为0。你需要在设计时,用鼠标在下拉箭头上(必须是这个位置)点一下,这时出现下图所示的方框,拉住下方的蓝块向下移动,直到一个满意的高度为止。)

    2.添加如下代码到COMMTEST3Dlg.cpp    

     1 void CCOMMTEST3Dlg::GetCom()
    2 {
    3 //程序启动时获取全部可用串口
    4 HANDLE hCom;
    5 int i,num,k;
    6 CString str;
    7 BOOL flag;
    8
    9 ((CComboBox *)GetDlgItem(IDC_COMBO))->ResetContent();
    10 flag = FALSE;
    11 num = 0;
    12 for (i = 1;i <= 16;i++)
    13 {//此程序支持16个串口
    14 str.Format("\\\\.\\COM%d",i);
    15 hCom = CreateFile(str, 0, 0, 0,
    16 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    17 if(INVALID_HANDLE_VALUE != hCom )
    18 {//能打开该串口,则添加该串口
    19 CloseHandle(hCom);
    20 str = str.Mid(4);
    21 ((CComboBox *)GetDlgItem(IDC_COMBO))->AddString(str);
    22 if (flag == FALSE)
    23 {
    24 flag = TRUE;
    25 num = i;
    26 }
    27 }
    28 }
    29 i = ((CComboBox *)GetDlgItem(IDC_COMBO))->GetCount();
    30 if (i == 0)
    31 {//若找不到可用串口则禁用“打开串口”功能
    32 ((CComboBox *)GetDlgItem(IDC_COMBO))->EnableWindow(FALSE);
    33 }
    34 else
    35 {
    36 k = ((CComboBox *)GetDlgItem((IDC_COMBO)))->GetCount();
    37 ((CComboBox *)GetDlgItem(IDC_COMBO))->SetCurSel(k - 1);
    38 //mCom.BindCommPort(num);
    39 }
    40 }

      3.OnInitDialog()中加入GetCom();

      4.头文件中加入void GetCom();

      5.执行程序,获取可用串口

      6.定义选择下拉列表的函数OnSelchangeComboSelePort();   

     1 void CMyDlg::OnSelchangeComboSelePort() 
    2 {
    3 //打开串口
    4 CString error,data;
    5 int i;
    6 i = ((CComboBox *)GetDlgItem(IDC_COMBO))->GetCurSel();
    7 ((CComboBox *)GetDlgItem(IDC_COMBO))->GetLBText(i,data);
    8 data = data.Mid(3);
    9 i = atoi(data);
    10
    11
    12
    13 if(m_mscomm_Cctrl_com.GetPortOpen()) m_mscomm_Cctrl_com.SetPortOpen(0);
    14 //m_nOpenPortNum = m_combo_Cctrl_port.GetCurSel() + 1;
    15 m_nOpenPortNum = i;
    16 m_check_open_port = TRUE;
    17 m_mscomm_Cctrl_com.SetCommPort(m_nOpenPortNum);
    18 try
    19 {
    20 m_mscomm_Cctrl_com.SetPortOpen(1);
    21 }
    22 catch(CException* e)
    23 {
    24 MessageBox("您选择的端口可能已被占用或不存在","检测",MB_OK);
    25 e->Delete();
    26 m_check_open_port = FALSE;
    27 }
    28 UpdateData(0);
    29 }

      7.执行程序,打开串口

      

    附录:VC中如何打开Com10及以上的串口(转载)

        今天用以前的一个串口程序,发现串口怎么也打不开。因为用的串口不是常规的COM1、COM2而是大于Com10的端口,想着是很简单的增加几个选项就可以轻松搞定的,结果加上后测试,发现总是初始化失败,调试发现在CreateFile里总是失败,找到MSDN一看果然这里有区别。

       Win32 API函数CreateFile()除了可打开普通文件外,还可以打开设备,比如可用于打开串口,获得串口句柄。使用CreateFile()函数打开串口时文件共享模式应设置为0(表示独占),创建参数设置为OPEN_EXISTING,模板必须设置为NULL。

       如果为COM1至COM9,可使用“COM1”-“COM9”作为文件名传递给CreateFile()函数,函数可成功返回。但是,如果操作对象为COM10及以上的端口,以此方式命名文件名调用CreateFile()函数会返回INVALID_HANDLE_VALUE,表示端口无法打开。

       产生这种奇怪现象的原因是:微软预定义的标准设备中含有“COM1”-“COM9”。所以,“COM1”-“COM9”作为文件名传递给函数时操作系统会自动地将之解析为相应的设备。但对于COM10及以上的串口,“COM10”之类的文件名系统只视之为一般意义上的文件,而非串行设备。

       为了增加对COM10及以上串行端口的支持,微软规定,如果要访问这样的设备,应使用这样的文件名(以COM10为例):\\.COM10
       所以,对于COM10及以上的串口,CreateFile()的调用样式应调整如下:

    CreateFile(
    "\\\\.\\COM10",           // 定义串口名
    fdwAccess,                // 存取模式(读写)
    0,                               // 共享模式:必须设置为0,表示设备独占使用
    NULL,                        // 保密性
    OPEN_EXISTING,      // 必须设置为OPEN_EXISTING
    0,                               // 文件属性,如果是异步模式,可设置为
    NULL                         // 模版,串口设备必须设置为NULL
    );
     
     

      

      

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 数字黑洞
    Minifilter微过滤框架:框架介绍以及驱动层和应用层的通讯
  • 原文地址:https://www.cnblogs.com/chinaqzh/p/2417939.html
Copyright © 2011-2022 走看看