vs2008中如何添加MSCOMM控件
- 格式:doc
- 大小:128.00 KB
- 文档页数:3
串口通信-MSComm控件使用详解2012-11-13 09:35 6988人阅读评论(0) 收藏举报控件编程 Delphi编程(13)MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
第12章 VB应用12.1 MSComm控件可以通过它对计算机的RS-23串行通信口进行读写操作1.主要属性设置:(1)CommPort属性:设置通信端口,一般计算机上1-2个RS-232口,由此属性指定使用哪个口,设定其值为1则表示使用1端口。
(2)Settings 属性:默认值“9600,n,8,1”。
9600——波特率n ——效验方式。
“n”不效验8 ——数据位1 ——停止位(3)Sthreshold 属性:设置要返回多少个字符才发生MSComm1_OnComm事件2.两台计算机串行通信的硬件接线A计算机的串口2脚(发送)——B计算机的串口3脚(接收)A计算机的串口3脚(接收)——B计算机的串口2脚(发送)A计算机的串口5脚(地)——B计算机的串口5脚(地)1.读写操作Private Sub Command1_Click() '发送MSComm1.Output = Text1.TextEnd SubPrivate Sub Command2_Click() '清空1Text1.Text = ""End SubPrivate Sub Command3_Click() '发送Text2.Text = MSComm1.InputEnd SubPrivate Sub Command4_Click() '清空2Text2.Text = ""End SubPrivate Sub Form_Load()MSComm1.PortOpen = TrueEnd Sub4.应用MSComm1_OnComm事件自动接收设置Sthreshold 属性为1,当有一个及以上字符进入串行口,发生MSComm1_OnComm事件。
Private Sub MSComm1_OnComm()Text2.Text = Text2.Text + MSComm1.InputEnd Sub。
使用VB中的MSComm控件实现RS-232串口通信实验准备:需要准备一些与串口通信有关的设备,如(外置式)调制解调器、计算机串口与调制解调器的连接线、一根DTE到DTE 的无调制解调器连接线(接法见本章有关习题的参考答案),在实验前检查计算机的两个串口是否能够正常工作。
实验环境:Windows 95/98操作系统,Microsoft VB 5.0以上程序设计环境。
对例题中涉及调制解调器的内容,采用计算机与调制解调器连接的方式;对在例题中设计数据传输的内容,须事先将DTE 到DTE的无调制解调器连接线的两端,分别插入Com1和Com2串口。
实验说明:VB中的MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件提供下列两种处理通讯的方式:(1)事件驱动(实时)方式,这是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在Carrier Detect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。
在这些清况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。
OnComm事件还可以检查和处理通讯错误。
(2)轮询方式,在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“OK”响应。
每个使用的MSComm控件都对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
可以在Windows“控制面板”中改变端口地址和中断地址。
下面这个简单的例子采用了轮询方法演示了用调制解调器进行基本的串行通讯:Private Sub Form_Load()Dim Instring As String '保存输入子串的缓冲区mPort=3 '使用COM3。
Vs2010中MSCOMM串口控件的使用Vs2010中MSCOMM串口控件的使用注意:Mscomm控件在VC6.0里面生成的类和VS2010里面生成的类不一样。
准确的说是封装的操作名字和使用方式有点不一样。
以对话框程序为例,下面试着在vs2010下使用该控件(控件在使用之前必须要注册)。
第一步:创建对话框程序,画好编辑框等控件。
第二步:插入MSCOMM控件,添加控件相关的类。
并为控件添加好变量。
第三步:添加消息处理函数,这里要注意的是MSCOMM控件的响应函数要右击控件选择添加事件处理函数,消息类型选择为OnComm类型。
下面是各个函数的实现:[cpp]01. //发送按钮按下响应函数02. void CCommTeatDlg::OnBnClickedButton3()03. {04. UpdateData(TRUE);05. m_mscomm.put_Output(COleVariant(m_EditSend));//向串口下发数据06. m_EditSend.Empty();//将编辑框内容清空07. UpdateData(FALSE);08. }[cpp]01. void CCommTeatDlg::OnBnClickedButton2()02. {03. m_mscomm.put_PortOpen(FALSE);//关闭串口04. AfxMessageBox(_T("串口已关闭"));//显示提示窗口05. }[cpp]01. void CCommTeatDlg::OnBnClickedButton1()02. {03. if(m_mscomm.get_PortOpen())//检测串口是否已经打开04. {05. m_mscomm.put_PortOpen(FALSE);//若串口已经打开,则关闭串口06. }07. m_mscomm.put_CommPort(1);//打开串口108. m_mscomm.put_InBufferSize(1024);//串口接收缓冲区大小09. m_mscomm.put_OutBufferSize(1024);//串口发送缓冲去大小10. m_mscomm.put_InputLen(0);//数据发送长度11. m_mscomm.put_InputMode(1);//数据发送模式12. m_mscomm.put_RThreshold(1);//13. m_mscomm.put_Settings(_T("4800,n,8,1"));//串口设置14. if(!m_mscomm.get_PortOpen())//检测串口是否打开,若关闭则打开串口15. {16. m_mscomm.put_PortOpen(TRUE);17. AfxMessageBox(_T("打开串口成功"));18. }19. else20. {21. m_mscomm.put_OutBufferCount(0);//清空输出缓冲区22. AfxMessageBox(_T("打开串口失败"));//提示串口打开失败23. }24. }特别注意一下这段:[cpp]01. BEGIN_EVENTSINK_MAP(CCommTeatDlg, CDialogEx)02. ON_EVENT(CCommTeatDlg, IDC_MSCOMM1, 1, CCommTeatDlg::OnCommMscomm1, VTS_NONE)03. END_EVENTSINK_MAP()[cpp]01. void CCommTeatDlg::OnCommMscomm1()02. {03. static unsigned int cnt = 0;04. VARIANT variant_inp;05. COleSafeArray safearryay_inp;06. long len,k;07. unsigned int data[1024]={0};08. byte rxdata[1024];09. CString stremp;10. if(m_mscomm.get_CommEvent() == 2)11. {12. cnt++;13. variant_inp = m_mscomm.get_Input();14. safearryay_inp = variant_inp;15. len = safearryay_inp.GetOneDimSize();16. for(k=0;k<len;k++)17. {18. safearryay_inp.GetElement(&k,rxdata+k);19. }20. for (k=0;k<len;k++)21. {22. stremp.Format(_T("%c"),*(rxdata+k));23. m_EditReceive += stremp;24. CString temp=_T("\r\n");25. m_EditReceive += temp;26. }27. }28. UpdateData(FALSE);29. }利用MSComm操纵串口数据1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
VS2008创建ActiveX控件VS2008创建ActiveX控件2010年03月15日星期一 16:12VS2008创建ActiveX控件编写代码前的设置打开AssemblyInfo.cs修改程序集信息。
引用System.Security命名空间,并添加[assembly : AllowPartiallyTrustedCallers()]安全声明修改[assembly: ComVisible(false)]为[assembly: ComVisible(true)]使程序集Com可见。
为Com Interop注册。
右键demoActiveX项目属性,在“生成”选项卡里将“为Com Interop注册”打上勾即可。
编写代码using System;using System.Collections.Generic;using ponentModel;using System.Drawing;using System.Data;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices; // 后添加的名称空间namespace demoActiveX{//用该Guid初始化demoActiveX,该Guid即是我们要在Web 页面下引用该ActiveX的CLSID[Guid("E5FD041B-8250-4cbc-B662-A73FC7988FB5")]public partial class demoControl : UserControl{public demoControl(){InitializeComponent();}public void Test(){MessageBox.Show("你输入的内容为:" + this.textBox1.T ext);}// 实现IObjectSafety接口,把ActiveX控件标记为安全的public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions) {// TODO: 添加 demoControl.GetInterfacceSafyOptions 实现pdwSupportedOptions = 1;pdwEnabledOptions = 2;}public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions){// TODO: 添加demoControl.SetInterfaceSafetyOptions 实现}//IObjectSafety 是一个接口,它可将其功能显露给Internet Explorer的“设置脚本安全性”和“设置初始化安全性”安全特性[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]public interface IObjectSafety{// methodsvoid GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions);}private void button1_Click(object sender, EventArgs e){textBox1.Text = "T est Only!";}}}编译,便可以得到一个dll文件。
MSComm控件MSComm控件通过串行端口传输和接受数据,为应用程序提供串行通信功能。
MSComm控件提供下列两种处理通信的方式:事件驱动通信是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在CarrierDetect(CD)或Request To Send(RTS)线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通信事件。
MSComm事件还可以检查和处理通信错误。
所有通信事件和通信错误的列表,参阅CommEvent属性。
在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
每个使用的MSComm控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
可以在Windows“控制面板”中改变端口地址和中断地址。
MSComm控件的属性1、CommPort属性设置或返回连接的串口编号。
必须指定该属性,Windows将会利用该串口和外界通信。
CommPort属性值用1,2,…表示串口COM1,COM2…,其取值范围为1~16,缺省为1。
MSComm控件支持的组大串口号是16个,CommPort属性值超过16,系统会通知出错,并返回前一次设定的值。
2、Settings属性设置或返回通信参数,值为字符串型表示,主要设定数据传输率、奇偶校验、数据位数,停止位等4个参数。
组成格式为:“BBBB,P,D,S”其中BBBB为数据传输率,P为奇偶校验,D为数据位数,S为停止位数。
默认的为“19200,N,8,1”表示传输速率19200bit/s,无奇偶校验位,8位数据位,1位停止位。
串口通信-MSComm控件使用详解2012-11-13 09:35 6988人阅读评论(0) 收藏举报控件编程 Delphi编程(13)MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
VS2008中使用ACTIVEX控件VS2005和2008中的控件的使用还真的是有点点的麻烦,VC6直接右键Insert ActiveX就搞定的事情,在VS2005中需要分成2步做。
首先,把TeeChart8.ocx放在某个目录下。
(或者在使用前现在系统中注册.ocx文件 regsvr32 teechart.ocx 卸载时加参数 -u)然后,在Visual Studio 2005里面新建基于TypeLib的MFC类,通过文件浏览找到控件所在的位置(或者在下拉列表中找TeeChart v8)。
这时就可以看到该控件引入的一大堆接口,除了ITChart,把其它所有的都加进来,然后确认。
这样就新建了一大堆的COleDispathDriver的类,都在*.h文件里面。
然后,在Visual Studio 2005里面新建基于ActiveX控件的MFC 类,通过文件浏览找到控件所在位置,这时可以看到该控件只有一个接口——ITChart,把它加进来,生成了CTChart的类,是基于CWnd 的。
这样就可以通过CTChart::Create(NULL,NULL,...(后面记不清了)动态创建控件。
这里要注意的是Create里面的字符串变量的使用,我之前一直用“”代替NULL,结果在程序运行时总报COLEException,说是DISP_E_MEMBERNOTFOUND,我找了很久很久才发现原来是这个原因。
(如果不需要动态的创建控件的话,可以在注册了控件之后,直接把.ocx文件拖动到工具箱中,或者在工具箱中选择com组建,把teechart v8 添加进来)。
创建该控件后就可以通过CTChart::AddSeries来添加曲线了,呵呵。
不过先别得意,通过这种方式创建的所有的类都是相互独立的,以前的CTChart::Series函数返回值是CSeries的变量,可以直接进行AddXY的操作,现在只能手工地将Series函数返回的LPDISPATCH (不知道写对没)变量用(CSeries)CTChart::Series(n)转换为CSeries的对象,然后进行画图啊什么的操作。
mscomm控件使用方法献花(0)4).InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
5).InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。
8).InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。
9).Input:从接收缓冲区读取一串字符。
10).OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
11).OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。
12).OutPut:向发送缓冲区传送一串字符。
该项目上位机采用Delphi编写,数据采集仪采用研华ADAM5510作为下位机采集实时压力数据,采用AcII方式传送数据,数据传输速率为9600bp,1位开始位,8位数据位,1位停止位,无奇偶校验位。
数据通信的具体格式为:。
程序用到的全局变量为:ReceiveStr:String;//接受Acii码字符数据字符串Setting:=9600,n,8,1;//设置通信口参数InputLen:=1;//设置Input一次从接受缓冲区读取字节数为1InBufferCount:=0;//清除接受缓冲区OutBufferCount:=0;//清除发送缓冲区InBufferSize:=50;//设置接受缓冲区为50字节OutBufferSize:=2;//设置发送缓冲区为2字节ShowMeage(串口已经打开!);end;2).数据接收与处理buffer:Olevariant;Temp:tring;cNow:Char;tmp某:Double;beginif((cLat=Chr(13))and(cNow=Chr(10)))thenbeginF1:=Trim(F1);dF1:=StrToFloat(F1);withSerieDepthdo//利用TChart绘制深度曲线begintmp某:=某Value[1]-某Value[0];Delete(0);Add某Y(某t+tmp某,dF1,,clGed);end;F1:=;end;if((cLat<>Chr(13))and(cNow<>Chr(10)))thenbeginF1:=F1+cNow;end;cLat:=cNow;end;end;3).串口关闭下面这些代码是针对发送和接收为16进制处理的。
好多朋友会有这样的疑问:VC6里有MSCOMM,VS2008中找不到,是不是需要自己下载控件啊?
其实,不需要的,你需要自己手工增加这个控件到面板上,增加时会浏览到控件目录,如果该目录上没有就需要返回一层,使用另一个目录,里面有几乎系统上所有的已注册控件。
2008不带这个控件,需要从VC6里拷过来手动注册。
另外,如果真有特殊情况你这个控件竟然还没有在系统中注册,或不小被卸载了,你只要从别的机器上复制这个ocx文件到系统目录,然后使用regsvr32注册就可以了。
然后增加到VC面板上的步骤同上。
当然这种情况极少。
综合起来有两种方法让你在VS2008中找到MSCOMM控件:
(一)
要对一个监控软件进行升级,拿到原来的源程序,里面用到了MSComm组件进行串口通信,上网上查了下添加MSComm组件的过程:
首先找个地方下载MSComm
转载..............................................................................................................
第一步:将Mscomm.srg, Mscomm32.ocx,Mscomm32.dep三个文件复制到系统文件夹中。
要注意的是,MSComm控件是要授权的,所以必须将其使用“执照”Licence 在注册表中登记注册,下一步就是注册方法。
至于为什么要这样做,可以看看下面的网页:/support/kb/articles/q151/7/71.asp
第二步:用Windows下的注册工具regsvr32注册该OCX控件,点击“开始”->"运行",再在中填入(假设操作安装在C盘,WIN2000):Regsvr32 C:\winnt\system32\Mscomm32.ocx
第三步:在注册表中手工新建一个主键项:先在点击“开始”->"运行",再在中填入regedit 命令打开注册表,找到HKEY_CLASSES_ROOT\Licenses,在其中添加主键
4250E830-6AC2-11cf-8ADB-00AA00C00905并将内容设置为:
kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
(注:这项内容也可以用记事本程序打开Mscomm.srg文件看到)................................................................................................................
在我的xp系统中试了一下,发现第二步后,注册表中自动出现了第三步需要手工添加的主键,也就是说不需要进行第三步操作。
在vs2008中使用MSComm提供的控件时,在工具箱中,通过选择项->com组件->Microsoft Communications Control,V ersion 6.0 添加Mscomm控件,将该控件拖到窗体后
就可以设置其属性,并且在引用中出现AxMSCommLib和MSCommLib
(二)
首先声明,VS2008编写MFC/C/C++的程序。
在VS2008中没有将串口通信控件MScomm控件包含进去,因此安装后,会找不到这个控件,这里介绍一个如何在Visual stdio 2008中应用MScomm控件的一个简单方法。
在你的计算机上安装一次V isual C++ 6.0,如果以前安装了Visual C++ 6.0,那就不用了,肯定是可以用了,但记得安装Visual C++ 6.0时要选择自定义安装,将ActiveX控件项选上,其它的可以不用安装。
安装V isual C++ 6.0后,MSComm控件就自动在你的计算机上注册了,这比手工注册控件省事多了,而且安装Visual C++ 6.0也不会“吃亏”的,毕竟Visual C++ 6.0的资源比.NET资源多多了。
菜单栏:工具-》选择工具箱选项-》COM组件,具体的见下图!
添加完控件后,该控件的小电话图标就会出现在工具箱的最下边,把它拖动到对话框上即可使用。
但是本人在为该控件添加变量后,出现
fatal error C1853: “Debug\test3.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反)的错误。
但是本人在为该控件添加变量后,出现
fatal error C1853: “Debug\test3.pch”预编译头文件来自编译器的早期版本,或者预编译头为
C++ 而在C 中使用它(或相反)的错误。
网上的解决办法是:把该工程的使用预编译头改为改为其它的另外的两个即可。