MSComm使用详解
mscomm控件的使用和安装
一、引言目前,在用计算机进行数据传输时,常用的是串行通信方式。
用C++Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件。
利用API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。
但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。
本文就简单的介绍一下在C++ Builder中利用MSComm 控件进行编程。
二、MSComm控件的常用属性和事件MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
事件驱动方式在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。
这种方法的优点是程序响应及时,可靠性高。
查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
1.MSComm 控件的常用属性CommPort属性:设置或返回通讯端口号,可以设置为1到16之间的任何值,本系统采用缺省值2;Settings属性:以字符串形式设置或返回波特率、奇偶校验、数据位和停止位,本系统采用缺省值"9600,n,8,1";PortOpen属性:设置或返回通讯口的状态以及打开和关闭端口,可通过把该属性设置为true或者false来打开或者关闭端口;InBufferSize和OutBufferSize属性:分别设置接收和发送缓冲区分配的内存数量,单位为字节,缺省值分别为1024byte和512byte;InputLen属性:确定希望从接收缓冲区移出的字符数量,当InputLen=0时,一次把接收缓冲区的字符全部移出;Input属性:从接收缓冲区中读出数据,然后将该数据从缓冲区移走。
com控件详解
MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。
当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。
本文的两个例子均采用该方式。
另一种为查询方式,在用户程序中设计定时或不定时查询 MSComm控件的某些属性是否发生变化,从而确定相应处理。
在程序空闲时间较多时可以采用该方式。
常用属性和方法利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。
以下是MSComm控件的常用属性和方法:●Commport:设置或返回串口号。
●Settings:以字符串的形式设置或返回串口通信参数。
●Portopen:设置或返回串口状态。
●InputMode:设置或返回接收数据的类型。
●Inputlen:设置或返回一次从接收缓冲区中读取字节数。
●InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
●InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
●Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
●OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
●OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
●Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
●Rthreshold:该属性为一阀值。
当接收缓冲区中字符数达到该值时,MSComm 控件设置Commevent属性为ComEvReceive,并产生OnComm事件。
用户可在OnComm 事件处理程序中进行相应处理。
若Rthreshold属性设置为0,则不产生OnComm 事件。
例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。
这样接收缓冲区中接收到一个字符,就产生一次OnComm 事件。
Vs2010中MSCOMM串口控件的使用
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控件出现在列表框中。
C#串口通信:MSComm控件使用详解
C#串口通信:MSComm控件使用详解目次MSComm 控件两种处理通讯的方式CommPort 属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Settings 属性InputLen 属性EOFEnable 属性Handshake 常数OnComm 常数InputMode 常数错误消息MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
vc串口通讯控件MSComm编程详解
vc串口通讯控件MSComm编程详解在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm 通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。
一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和皿信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个vB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
2.使用Mscomm控件在开始使用MSComm控件之前。
需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。
也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。
在该控件的对象库中也可以找到这些常量。
常量值描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。
MSComm控件的用法和函数说明
MSComm控件进行串口编程步骤:1. 在建立的程序工程中插入MSComm控件。
2. 添加MSComm控件ID 的控制变量(或者对象)。
3. 对串口进行初始化,设置MSComm控件的属性。
4. 添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码5. 编写串口发送等其他代码。
6. 关闭串口。
+MSComm控件常用属性:mPort:设置并返回通信端口号2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位3.PortOpen:设置并返回通信端口的状态。
也可以打开和关闭端口4.Input:从接收缓冲区返回和删除字符5.Output:向传输缓冲区写一个字符6.InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
7.InBufferSize:设置或返回输入缓冲区的大小。
8.OutBufferSize:设置或返回输入缓冲区的大小。
9.InBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
10.OutBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
用法说明mPort:设置并返回通信端口号Void CMSComm::SetCommPort(short n); 设置串口号Short CMSComm::GetCommPort(); 查询当前串口号说明:n可以设置成1到16中的任何数(缺省值为1)。
但是,如果用PortOpen属性打开一个并不存在的端口是,MSComm控件会产生错误68(设备无效);必须在打开端口之前设置CommPort属性。
2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位Void CMSComm::SetSettings(LPCTSTR lpszNewValue);CString CMSComm::GetSettings();说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。
MSComm控件的应用(串口编程)
MSComm控件的应用(串口编程)MSComm控件通过串行端口发送和接收数据,为应用程序提供了串行通讯功能。
在基于对话框的应用程序中加入一个MSComm控件非常简单。
只需打开“Project->AddToProject->Components and Controls->Registered Activex Controls”,然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中。
CMS m类的相关文件 mscomm.cpp 和 mscomm.h 就加到工程中了。
从工具箱中把MSComm控件拖到对话框上,给控件关联成员变量m_Comm。
1.初始化串口,一般在OnInitDialog()函数中m_Comm.SetCommPort(1); //选择COM1m_Comm.SetInputMode(1); //设置数据通讯格式为二进制数组格式0.为文本格式//1.为二进制数组格式m_Comm.SetSettings("9600,n,8,1");//设置波特率为9600bps,无奇偶校验位,数据位8//位,停止位1位m_Comm.SetRThreshold(1); //设置为每次接到一个字节数据就触发OnComm事件m_Comm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取波特率:110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、115200 奇偶校验:E偶校验、M标号校验、N无校验、O奇校验、S空格校验数据位:4、5、6、7、8停止位:1、1.5、22.打开串口if(!m_Comm.GetPortOpen()) //如果串口是关闭的,则行打开串口{m_Comm.SetPortOpen(true);m_Comm.GetInput(); //清除串口输入缓冲区中残留数据}else{AfxMessageBox("串口打开失败!");}3.关闭串口if(m_Comm.GetPortOpen()){m_Comm.SetPortOpen(false);}4.接受数据,OnComm()函数中,数据保存在RcvData中VARIANT m_input;char *str;int len,nEvent;CString RcvData;nEvent = m_Comm.GetCommEvent();switch(nEvent){case 2:len=m_Comm.GetInBufferCount(); //接收缓冲区的字符数目if(len>0){m_input=m_Comm.GetInput();str=(char*)(unsigned char*)m_input.parray->pvData;}*(str+len) = '\0’;RcvData.Format("%s", str);}5.发送数据,把str数据发送出去int i,Count;Count=str.GetLength();CByteArray m_Array;m_Array.RemoveAll();m_Array.SetSize(Count);for(i=0;i<Count;i++){m_Array.SetAt(i,str[i]);}m_Comm.SetOutput(COleVariant(m_Array));。
串口通信-MSComm控件使用详解
串口通信-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 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
msm控件的用法和函数说明
MSComm控件进行串口编程步骤:1.在建立的程序工程中插入MSComm控件。
2.添加MSComm控件ID 的控制变量(或者对象)。
3.对串口进行初始化,设置MSComm控件的属性。
4.添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码5.编写串口发送等其他代码。
6.关闭串口。
+MSComm控件常用属性:mPort:设置并返回通信端口号2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位3.PortOpen:设置并返回通信端口的状态。
也可以打开和关闭端口4.Input:从接收缓冲区返回和删除字符5.Output:向传输缓冲区写一个字符6.InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
7.InBufferSize:设置或返回输入缓冲区的大小。
8.OutBufferSize:设置或返回输入缓冲区的大小。
9.InBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
10.OutBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
用法说明mPort:设置并返回通信端口号Void CMSComm::SetCommPort(short n);设置串口号Short CMSComm::GetCommPort();查询当前串口号说明:n可以设置成1到16中的任何数(缺省值为1)。
但是,如果用PortOpen属性打开一个并不存在的端口是,MSComm控件会产生错误68(设备无效);必须在打开端口之前设置CommPort属性。
2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位Void CMSComm::SetSettings(LPCTSTR lpszNewValue);CString CMSComm::GetSettings();说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。
Mscomm控件属性、方法及事件
Mscomm控件1、引用Mscomm控件Mscomm控件不是普通的工具箱控件,在VB中首先要引用Mscomm控件,而后才能使用用它。
引用Mscomm控件很简单:选择“工程”主菜单,在“工程”菜单上选择“部件”命令,弹出如图所示的部件对话框,在控件属性页上选定“Microsoft Comm Control 6.0”控件,单击“确定”按钮后,Mscomm就添加到控件面板上。
2、Mscomm控件信息处理Mscomm控件拥有功能完善的串口数据的发送和接收功能,Mscomm控件提供了两种处理方式。
●事件驱动方式:由Mscomm控件的OnComm事件自动捕获并处理通信错误及事件;●查询方式:通过定时查询Mscomm控件CommEvent属性的值来判断事件和错误。
在PC机串行端口通信时,使用了十几条线进行信号传输。
利用Mscomm控件开发串口通信软件,需了解以下5条线的代号及作用,这5条线的高低电平状态分别对应Mscomm 控件的相应属性的True/False值:●DRT线:用于传输PC机发往串口Modem等设备的信号,该信号表示PC机是否已准备好;●RTS线:用于传输PC机发往串口Modem等设备的信号,该信号表示PC机是否允许Modem发数据;●DSR线:用于传输串口Modem等设备发往PC机的信号,该信号表示串口Modem 等设备是否已做好操作准备;●CTS线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem是否允许发送数据;●CD线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem已经和远方的设备建立了连接。
Mscomm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv 解释并传给设备驱动程序执行的,对于VB程序开发者只需要知道MSComm控件的属性和事件的用法即可以实现对串口的操作。
3、Mscomm控件的属性(1)CommPort属性该属性用于设置或返回连接的串口编号,Windows将会利用该串口和外界通信。
mscom控件详解(龚建伟)
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm 控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
SMCOMM控件使用
串口通信控件简介MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft 公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
由于MSComm控件不是标准控件,要使用它就必须将MSComm控件添加到控件工具箱中添加控件的方法:选择“工程”|“部件”命令,在出现的“部件”对话框中选择“Microsoft Comm Controls 6.0”选择并单击“确定”按钮。
这时候MSComm控件就被添加到VB的控件工具箱中了。
如右图:(在图中那个电话标识)串口的初始化:1With MSComm1 初始化串口mPort = 13.Settings = "19200,N,8,1"4.OutBufferSize = 10245.InBufferSize = 10246.PortOpen = True7End With在上述初始化中完成了:设置通信端口,串口通信参数(波特率、奇偶校验、数据位、停止位),接收缓冲区的字节数,传输缓冲区的字节数,设置端口的状态为打开。
上述初始化放在窗体加载中完成。
数据的传输:在这里,我们先添加2个按钮控件,1个文本控件,1个标签控件。
点击“生成串号”按钮,读取到当前日期,显示在文本控件中。
1Private Sub Command1_Click()2Dim time_now1 As Date3time_now1 = Now4Text1.Text = Format(time_now1, "yyyymmdd")5used_data = False6End Subused_data为一个全局变量,目的是避免一次的数据发送好几次。
图解VC++6.0中使用mscomm串口控件
m_ComPort.SetInputMode(1);//以二进制方式读写数据 m_ComPort.SetRThreshold(1);//接收缓冲区有大于等于 1 个字符时,将引发接收数据的 OnCommMscomm 事件 m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数 if(!m_ComPort.GetPortOpen()) //打开串口
safearray_inp.GetElement(&k,rxdata+k); //转换为 BYTE 型数组 BYT E bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量 strtemp 存放 m_receive+=strtemp; } break; default: // 传输事件出错 m_ComPort.SetOutBufferCount(0); break;
在 sportDlg.cpp 中增加: BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )
ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射 //ActiveX 控件事件
END_EVENTSINK_ M AP()
// TODO: Add your control notification handler code here UpdateData(TRUE); int len; CByteArray array; len=m_send.GetLength(); array.RemoveAll(); array.SetSize(len); for(int i=0;i<len;i++)
mscom控件详解龚建伟
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm 控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
mscomm控件操作步骤
使用Mscomm串口控件之前应确保它已经在本机上安装且注册,VC串口通信技术网有文章介绍mscomm串口控件的注册方法,本站出售的资料“VC 串口通信资料集”也专门收到了此控件,不过在安装了VC后都会自动安装此控件,但是发布您的串口应用程序时就得考虑如何在目标计算上机上注册了,参考本站文章:串口控件MSCOMM的注册方法(使用MSCOMM串口控件程序的发布问题)。
Mscomm不仅是一个VC 串口控件,由于它是基于Activex的,所以也可以在VB、Deliph、C++ Builder等其它可以使用Activex控件的开发工具中使用,最重要的一点是它是微软官方的控件,所以有很多人在使用它。
下面介绍如何在VC6工程中使用mscomm串口控件。
1、建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest; 2、在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls 中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
MSCOMM控件的应用
MSCOMM 控件的应用出处:网络MSComm 控件为你的应用程序提供了串口通信的功能,它允许你通过串口来发送和接收数据。
MSComm 控件提供了以下的两种处理通讯的手段:事件驱动通讯是一个处理和串口交互强有力的方法。
在很多情况下,你想要一个事件发生的时间,例如:从CD(Carried Detect)或RTS(Request To Send)线到达一个字符或发生了改变。
在这种情况下,采用MSComm 控件的OnComm 事件来捕捉和处理这种通讯事件。
OnComm 事件也可以检测和处理通讯时发生的错误。
对于那些可能事件和通讯的错误,请参考CommEvent 属性。
你也可以通过检测CommEvent 属性的值来发现应用程序中的事件和出错。
每个MSComm 控件可以控制你和一个串口进行通讯。
如果需要通过应用程序访问更多的串口,必须使用更多的MSComm 控件。
端口地址和中断号可以由WINDOW S 中的控制面板来改变。
以下是MSComm 控件的主要属性:MSComm 控件属性input 属性说明:返回和设置从接收缓收区中得到的数据流。
在允许阶段该属性为只读。
不可更改语法:MSCommname.inputInput 属性、inputlen 属性和inputmode 属性是有关系的。
Inputlen 属性决定读取的字符个数。
当inputlen 属性为0时,用input 属性来读取数据时将讯取整个缓冲区中的数据。
Inputmode 属性是设置读取数据的类型。
当inputmode 属性被子设置为comin putmodetext 时,数据被读取并按照文本的形式存储在变量中;而当inputmode 属性设置为cominputmodebinary 时,则接收来的数据按照二进制形式存储在一个二进制数组中。
commevent 属性。
说明:返回最近的通讯事件和错误。
语法:mevent虽然oncomm事件在通讯错误和通讯事件发时都响应,但commevent属性为这些通讯事件和通讯错误保留出错数字码。
MSComm控件使用总结
MSComm控件在VS2010和VC6++中是不同的,下面以VS2010中为例,说明该控件的使用:1、打开串口,并初始化void CSMommTestDlg::OnBnClickedBtn(){// TODO: 在此添加控件通知处理程序代码if (m_Comm.get_PortOpen())//如果发现串口原来是打开的,关闭串口m_Comm.put_PortOpen(FALSE);m_Comm.put_CommPort(1);//选择COM1端口m_Comm.put_InBufferSize(1024);//设置输入缓冲区大小m_Comm.put_OutBufferSize(512);//设置输出缓冲区大小m_Comm.put_Settings("9600,n,8,1");//设置波特率9600,无校验,8个数据位,1个停止位if (!m_Comm.get_PortOpen()){m_Comm.put_PortOpen(TRUE);//打开串口m_Comm.put_RThreshold(1);//每当接收缓冲区中有1个字符,则接收串口数据m_Comm.put_InputLen(0);//设置当前缓冲区长度为0m_Comm.get_Input();//预读缓冲区以清除残留数据}else{AfxMessageBox("打开端口失败!");}}2、OnComm事件处理,当接受到信息的时候会触发这一事件void CSMommTestDlg::OnCommMscomm(){// TODO: 在此处添加消息处理程序代码VARIANT variant_inp;COleSafeArray safearray_inp;CString strInput;if (m_Comm.get_CommEvent()==2)//值为2表示接收缓冲区内有字符{variant_inp=m_Comm.get_Input();//读取缓冲区消息strInput=variant_inp.bstrVal;SetDlgItemText(IDC_EDIT_RECV,strInput);}}3、发送消息void CSMommTestDlg::OnSendClickedBtn(){// TODO: 在此添加控件通知处理程序代码CString str;GetDlgItemText(IDC_EDIT_SEND,str);m_Comm.put_Output(COleVariant(str));//发送数据}。
MSComm应用注意
MSComm的使用
应用图如图所示,注意事项如下:
第一,应当采用顺序执行结构,因为,串口只能被一个程序或设备打开一次,然后串口就永被该程序或设备占用,如果此时再有程序要
求打开被占用的串口,哪怕是同一个程序的要求,就会出错,至
于Windows是怎样实现这种串口的,不清楚。
所以应当采用顺序
结构,以免程序两次要求打开串口。
第二,在设置MSComm的各项属性之前,必须把串口关闭,串口在打开的状态下,不允许更改其已经设定好的属性值。
第三,在设置MSComm各项属性值时,PortOpen属性必须放在最后,因为,只有把其它属性值都设置好之后,才可以打开串口,串口
一旦被打开,属性值就不再允许改变,MSComm属性值采用一种
从上往下的排列方式,程序处理时也是从上往下处理,尽管模拟
时数据流是同时流的,实际和电脑模拟的不太一样(灯亮看数据
流模拟)。
第四,插入的MSComm初始引用图标,
必须占据顺序执行结构的一个方
框,如右图所示,如果把MSComm
初始引用图标放入右图第二
个方框或把属性值放
入右图第一个方框,都会出错。
出错原
因:不明。
总起来说,第一个方框放置
初始引用图标,第二个方框设置
MSComm串口属性值。
然后,第三个方框就可以进行串口工作了(属猜
测)。
第五,MSComm属性值CommEvent是只读的,也就是说,CommEvent的各项事件都是已设定好的,当满足各种事件所要求的各种条件时,各事件会自动
触发,不需要我们进行CommEvent事件选择设定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MSComm控件使用详解龚建伟:这篇东西来不及好好整理,因有朋友经常提及,先放在这里,如果有必要,再详细理顺一下,更为详细的信息请去看MSDN。
摘要:本文详细介绍了MSComm控件在串口编程中使用。
目次MSComm控件两种处理通讯的方式CommPort属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Settings 属性InputLen 属性EOFEnable 属性Handshake 常数OnComm 常数InputMode 常数错误消息MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm 控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX 控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
2.MSComm 控件的常用属性MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。
也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
下面分别描述:CommPort属性设置并返回通讯端口号。
语法 mPort[value ] (value 一整型值,说明端口号。
)说明在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。
但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。
注意:必须在打开端口之前设置 CommPort 属性。
RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生OnComm 之前,设置并返回的要接收的字符数。
语法 object.Rthreshold [ = value ](value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。
)说明当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。
例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
CTSHolding 属性:确定是否可通过查询 Clear To Send (CTS) 线的状态发送数据。
Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。
该属性在设计时无效,在运行时为只读。
语法: object.CTSHolding(Boolean)Mscomm 控件的 CTSHolding 属性设置值:True Clear To Send 线为高电平。
False Clear To Send 线为低电平。
说明:如果 Clear To Send 线为低电平 (CTSHolding = False) 并且超时时,MSComm 控件设置 CommEvent 属性为 comEventCTSTO (Clear To Send Timeout) 并产生OnComm 事件。
Clear To Send 线用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。
如果需要确定 Clear To Send 线的状态,CTSHolding 属性给出一种手工查询的方法。
详细信息有关握手协议,请参阅 Handshaking 属性。
SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
语法 object.SThreshold [ = value ]value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。
说明:若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。
若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生OnComm 事件。
如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为comEvSend,并产生 OnComm 事件。
comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。
例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。
如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。
Handshake 常数常数值描述comNone 0 无握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常数常数值描述comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。
Error 常数常数值描述comEventBreak 1001 接收到中断信号comEventCTSTO 1002 Clear-to-send 超时comEventDSRTO 1003 Data-set ready 超时comEventFrame 1004 帧错误comEventOverrun 1006 端口超速comEventCDTO 1007 Carrier detect 超时comEventRxOver 1008 接收缓冲区溢出comEventRxParity 1009 Parity 错误comEventTxFull 1010 传输缓冲区满comEventDCB 1011 检索端口设备控制块 (DCB) 时的意外错误InputMode 常数常数值描述comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。
comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。
CDHolding 属性:通过查询 Carrier Detect (CD) 线的状态确定当前是否有传输。
Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。
该属性在设计时无效,在运行时为只读。
语法 object.CDHolding设置值:CDHolding 属性的设置值为:设置描述True Carrier Detect 线为高电平False Carrier Detect 线为低电平说明:注意当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(Carrier Detect 超时错误),并产生OnComm 事件。
注意在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。
Carrier Detect 也被称为 Receive Line Signal Detect (RLSD)。
数据类型 BooleanDSRHolding 属性:确定 Data Set Ready (DSR) 线的状态。
Data Set Ready 信号由调制解调器发送到相连计算机,指示作好操作准备。
该属性在设计时无效,在运行时为只读。
语法:object.DSRHoldingobject 所在处表示对象表达式,其值是“应用于”列表中的对象。
DSRHolding 属性返回以下值:值描述True Data Set Ready 线高False Data Set Ready 线低说明:当 Data Set Ready 线为高电平 (DSRHolding = True) 且超时时,MSComm 控件设置 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm 事件。
当为 Data Terminal Equipment (DTE) 机器写 Data Set Ready/Data Terminal Ready 握手例程时该属性是十分有用的。
数据类型:BooleanSettings 属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。
语法: object.Settings[ = value]说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。