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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值