使用VC6.0 自动识别可用串口 添加至combox 并打开。
2013-01-12 00:13
337 查看
1.新建COMMTEST3工程,添加一个combobox到界面,id设置为IDC_COMBO。
(注意:组合框(ComboBox),运行时点击其右边的小箭头拉不下来(即不出现下拉列表)。需如下设置:
这是使用VC++的人最初常遇到的问题,实际上是下拉列表的高度设置不当。组合框的高度是不能修改的,它是由系统决定的,但下拉部分的高度(即在下拉框中显示多少行)是可以设置的。在VB和Delphi中默认的高度是8行,但在VC++中默认为0。你需要在设计时,用鼠标在下拉箭头上(必须是这个位置)点一下,这时出现下图所示的方框,拉住下方的蓝块向下移动,直到一个满意的高度为止。)
2.添加如下代码到COMMTEST3Dlg.cpp
3.OnInitDialog()中加入GetCom();
4.头文件中加入void GetCom();
5.执行程序,获取可用串口
6.定义选择下拉列表的函数OnSelchangeComboSelePort();
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
);
(注意:组合框(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
);
相关文章推荐
- 使用VC6.0 自动识别可用串口 添加至combox 并打开。
- VC6.0 自动识别可用串口 添加至combox 并打开
- VC6.0 自动识别可用串口 添加至combox 并打开
- VC6.0 自动识别可用串口 添加至combox 并打开
- powerpoint 2010 打开ppt时才是提示错误,提示“Microsoft powerpoint 无法执行语言识别,此功能不可用。若要使用此功能 ,请再次运行安装程序,选择“添加或删除功能”,
- VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出
- VC6.0“打开”和“添加到工程”失效,使用对应快捷键出错的解决办法
- linux下检测可用串口并使用minicom打开
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
- VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出
- linux下检测可用串口并使用minicom打开(改进版)
- win7下VC6.0打开添加无法使用的解决办法 及 Win7下安装VC6.0的完美解决方案
- 对着电脑吼一声,自动打开谷歌网站或者自动打开命令行终端--使用google speech 语音识别程序操作电脑
- 当使用VS CODE 时,如果窗口中打开的文件无法识别HTML的话,可以使用以下方法添加要识别的文件类型
- VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出
- VC6.0中无法使用打开按钮,无法添加已有的文件
- 自动识别串口号|打开COM9之后的串口|XXX.exe已停止工作|Qt textBrowser滚动条设置到底部
- VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出
- VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出解决方法
- VC6.0打开文件时出错、无法添加使用的解决办法