VC的MSCOMM控件

合集下载

C#串口通信:MSComm控件使用详解

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 控件。

MSComm控件属性与事件

MSComm控件属性与事件

MSComm控件属性与事件1、CommPort属性•功能:设置或返回通信端口号。

•语法:–void CMSComm::SetCommPort(short nNewV alue); //设置串口号–short CMSComm::GetCommPort(); //查询当前串口号•说明:–nNewV alue取值范围:1~16,但是如果用SetPortOpen属性打开一个不存在的串口号,将产生错误。

•注意:–必须在打开端口之前设置CommPort属性。

程序://根据当前端口号选择所要打开的串口m_Comm.SetCommPort(atoi(m_strCOM.Mid(3,1)));2、PortOpen属性•功能:用于打开或关闭串口,或者返回串口的开关状态。

•语法:–void CMSComm::SetPortOpen(BOOL bNewV alue);–BOOL CMSComm::GetPortOpen();•说明:–bNewV alue=TRUE,则打开串口;–bNewV alue=FALSE,则关闭串口;–当程序终止时,MSComm控件会自动关闭。

–BOOL CMSComm::GetPortOpen(),返回值为真,则串口已打开,否则,未打开;程序if(m_Comm.GetPortOpen()){m_Comm.SetPortOpen(FALSE);}if(!m_Comm.GetPortOpen()){m_Comm.SetPortOpen(TRUE);//打开串口按钮颜色正常GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(FALSE);//关闭串口按钮颜色变灰GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(TRUE);}else{AfxMessageBox("cannot open serial port");}3、RThreshold属性•功能:•语法:–void CMSComm::SetRThreshold(short nNewV alue);–short CMSComm::GetRThreshold();•说明:–接收缓冲区收到nNewV alue个字符时产生OnComm事件。

基于VCMSComm控件的串行通信

基于VCMSComm控件的串行通信

基金项目:航空工业部技改资助项目作者简介:杨海涛( ),男,河南孟津人,硕士生 收稿日期:文章编号: ( )基于 控件的串行通信杨海涛 ,张自强( 河南科技大学电子信息工程学院,河南洛阳 ; 上海师范大学机械与电子工程学院,上海 )摘要:在介绍 平台下串行通信机理的基础上,讨论了基于 控件进行串行通信的方法。

通过 控件为串行数据通信提供的各种协议,以及使用该控件事件驱动方式,处理和解决了通信软件的开发设计问题,方便而快捷地实现了串行通信功能。

最后通过实验对程序进行了调试。

关键词:计算机通信;数据通信;程序设计中图分类号:文献标识码:前言随着微机网络和多微机系统的广泛应用,接口通讯技术已成为十分关键的技术[ ]。

许多杂志上已有很多介绍串口编程的文章,但很少有详细介绍在 环境下基于 控件进行串行通信的资料。

本文通过一个实例来说明在可视化语言 中,如何使用 进行串行数据通信。

串行通信在远程通信时可减少通信线路费用,能避免众多连线间的信号干扰,充分保障了通信的可靠性,因而倍受设计者的青睐。

在信号接收和发送过程中,对端口的数据采集和数据发送的方法虽有不少,但许多方法或过于复杂[ ],或存在局限性[ ],而 控件在串行通信的软件中集便捷性、可靠性、实时行、准确性于一身,使得串行通信系统的设计操作方便、快捷、实用成为可能。

基于 控件的串行通信串行通信系统终端设备和计算机之间或计算机之间串行数据通信系统的基本构成如图 所示。

数据终端 ()可以是计算机或打印机。

数据电路终结设备( )可以是调制解调器( ),也可以是简单的线路驱动器。

通常在计算机标准接口上外加一个专门的转换器,使 和 或 相连进行远距离传输。

当通信距离较近时(小于 )可用电缆将两台设备直接相连。

在通信过程中双方必须共同遵守通信协议,它对数据格式、同步方式、传送速度、传送顺序、检查纠错方式以及控制字符定义等问题作出统一规定。

该协议属于 (国际标准化组织)的 (开放系统互联)七层参考模型中的数据链路层。

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计

利用MSCOMM串口通信控件进行异步串行通信的VC程序设计一课程设计题目利用MSCOMM串口通信控件进行异步串行通信的VC程序设计二课程设计要求●环境要求:Windows95/98/2000/XP●功能要求:能将键盘上输入的数据发送到另一台计算机上;能将接收到的数据显示到屏幕窗口内;了解常用通信网络设备的操作和应用,掌握常用的通信协议的工作原理,能利用Visual C++、开发工具完成相应的通信程序的设计工作。

学习简明地介绍自己的设计工作。

三课程设计目的用Visual C++编程工具主机提供的接口,解决网络用户之间的交互式对话问题。

进一步深入掌握网络设计和通信程序的设计原理。

使学生对计算机通信网络的设计实现有较深的了解,培养较高的通信网络设计能力。

四程序思路硬件连接方面:数据的发送和接收由软件控制,不进行硬件握手,其连接方法如图真正需要互相连接的是RXD、TXD和GND;软件方面:串行端口的本质功能是作为CPU和串行设备间的编码转换器。

当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。

在接收数据时,串行的位被转换为字节数据在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。

使用非常方便。

⑴.在当前的Workspace中插入MSComm控件。

Project菜单------>Add to Project---->Components and Controls----->RegisteredActiveX Controls--->选择Components: Microsoft Communications Control,version 6.0 插入到当前的Workspace中。

VC6.0添加CMSComm控件的几个问题

VC6.0添加CMSComm控件的几个问题
2、添加2:
当添加1不能添加时:
窗口----->右击鼠标----->Insert Active Controls------->Microsoft Communications Control,version 6.0------->之后手动添加.app及.h文件;
手动添加.app及.h文件: Ctrl+W 打开类项导---->Member Variables --->Add Variable --->OK。
>>> You should call it in your app's InitInstance function.
在其app::InitInstance()中加入AfxEnableControlContainer()
经过1or2后编译后按f5调试运行程运行不起来自动关闭并出现如下错误
VC6.0添加CMSComm控件的几个问题
1、添加1:
Project--->Add To project--->Components and Controls--------->Microsoft visual Studio/common/msdev98/gallery/Registered ActiveX Controls--------->Microsoft Communications Control,version 6.0------->之后自动添加.app及.h文件----->OK。
3、在app::InitInstance()中加入AfxEnableControlContainer()
经过1or2后,编译后,按F5调试运行,程序运行不起来,自动关闭并出现如下错误:

CSerial类与MSComm控件

CSerial类与MSComm控件

一、CSerialPort类支持多线程链接(非MODEM)的串口编程操作,其步骤如下:第一步:在**Dlg.h文件添加#include "SerialPort.h"(需先加入类头文件与源文件)第二步:添加成员变量 CSerialPort serialPort;第三步:在初始化对话框函数中调用serialPort.InitPort,serialPort.StartMonitoring 第四步:发送,serialPort.WriteToPort(buf);第五步:接收,在类的定义中,声明消息函数afx_msg LONG OnCommunication(UINT, LONG);在.cpp文件中添加映射ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)并实现LONG **Dlg::OnCommunication(WPARAM ch, LPARAM port)基于单文档的应用程序,则初始化在新增加的OnInitialUpdate()中添加代码。

说明:由于OnCommunication(WPARAM ch,LPARAM port)带参,所以其接收代码比MSComm 控件的接收代码简单很多,不要涉及接收函数及其数据类型的转换。

二、但对于MODEM控制,需要对类进行改写,采用MSComm控件比较理想。

使用MSComm控件进行编程的基本步骤:1)在建立的工程中加入MSComm控件;2)添加MSComm控件的ID关联变量(或者对象);3)对串口进行初始化,设置MSComm控件的属性(一般在OnInitDialog中);4)添加串口事件的消息处理函数OnComm(),在函数中根据应用需要,编写数据处理代码;(一般用于接收缓冲区里面的数据)5)编写串口发送等其他代码;(一般在按钮处理函数中实现)6)关闭串口。

以上采用MSComm控件的是事件驱动方式,即通过函数OnComm()处理。

VC的MSCOMM控件

VC的MSCOMM控件

MFC之MSCOMM2010年11月19日星期五在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。

一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和通信的通道。

这些串口在CPU和外设之间充当解释器的角色。

当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。

2.使用Mscomm控件在开始使用MSComm控件之前。

需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。

也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。

在该控件的对象库中也可以找到这些常量。

常量值描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。

Visual Basic 6MSComm控件

Visual Basic 6MSComm控件

Visual Basic6.0(以下简称VB)是一种功能强大、简单易学的程序设计语言。

它不但保留了原先Basic语言的全部功能,而且还增加了面向对象程序设计功能。

它不仅可以方便快捷地编制适用于数据处理、多媒体等方面的程序,而且利用ActiveX控件MSComm还能十分方便地开发出使用计算机串口的计算机通信程序。

本文结合计算机通信的两个例子,详细介绍如何在VB中使用MSComm控件。

处理方式MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。

当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。

本文的两个例子均采用该方式。

另一种为查询方式,在用户程序中设计定时或不定时查询MSComm控件的某些属性是否发生变化,从而确定相应处理。

在程序空闲时间较多时可以采用该方式。

常用属性和方法利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。

以下是MSComm 控件的常用属性和方法:●Commport:设置或返回串口号。

●Settings:以字符串的形式设置或返回串口通信参数。

●Portopen:设置或返回串口状态。

●InputMode:设置或返回接收数据的类型。

●Inputlen:设置或返回一次从接收缓冲区中读取字节数。

●InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。

●InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。

●Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。

●OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。

●OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。

●Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。

●Rthreshold:该属性为一阀值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC之MSCOMM2010年11月19日星期五在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。

一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和通信的通道。

这些串口在CPU和外设之间充当解释器的角色。

当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。

2.使用Mscomm控件在开始使用MSComm控件之前。

需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。

也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。

在该控件的对象库中也可以找到这些常量。

常量值描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。

在发送字符时,在系统指定的事1件内,CTS(Clear To end)线是低电平ComEventDSRTO 1003 Data Set Ready Timeout。

在发送字符时,在系统指定的事件内,DSR(Data Set Ready)线是低电平ComEventFrame 1004 数据帧错误。

硬件检测到一个数据帧错误ComEventOverrun 1006 端口溢出。

硬件中的字符尚未读,下一个字符又到达,并且丢失ComEventCDTO 1007 Carrier Detect Time。

在发送字符时,在系统指定的事件内,CD (Carrier Detect)线是低电平。

CD 也称为RLSD(Receive Line Singal Detect,接收线信号检测)ComEventRxOver 1008 接收缓冲区溢出。

在接收缓冲区中没有空间ComEventRxParity 1009 奇偶校验错。

硬件检测到奇偶校验错误7ComEventTxFull 1010 发送缓冲区满。

在对发送字符排队时,发送缓冲区满ComEventDCB 1011 检取端口DCB(Device Control Blick)时发生了没有预料到的错误通信事件包含了下面的设置:常量值描述ComEvSend 1 发送缓冲区中的字符数比Sthreshold值低ComEvReceive 2 接收到了Rthreshold个字符。

持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据ComEvCTS 3 CTS(Clear To Send)线改变ComEvDSR 4 DSR(Data Set Ready)线改变。

当DSR从1到0改变时,该事件发生ComEvCD 5 CD(Carrier Detect)线改变ComEvRing6检测到响铃信号。

一些URAT (Universal AsynchronousReciver--Transmitters,通用异步收发器)不支持该事件ComEvEOF 7 收到了EOF字符(ASCII字符26)Error消息(MSComm控件)下表列出了MSComm控件可捕获的错误消息:常量值描述ComInvalidPropertyValue 380 无效的属性值ComSetNotSupported 383 属性只读ComGetNotSupported 394 属性只读ComPortOpen 8000 端口打开时该存在无效8001 超时设置必须比0值大ComPortInvalid 8002 无效的端口号8003 属性只在运行时有效8004 属性在运行时是只读的ComPortAleadyOpen 8005 端口已经打开8006 设备标识符无效或不支持8007 不支持设备的波特率8008 指定的字节大小无效8009 缺省参数错误8010 硬件不可用(被其他设备锁住)8011 函数不能分配队列ComNoOpen 8012 设备没有打开8013 设备已经打开8014 不能使用通信通知ComSetCommStateFailed 8015 不能设置通信状态8016 不能设置通信事件屏蔽ComPortNotOpen 8018 该存在只在端口打开是有效8019 设备忙ComReadError 8020 通信设备读错误ComDCBError 8021 检取端口设备控制块时出现内部错误注意在使用的时候一定要保证两个通讯串口的设置是相同的,否则受到的信息将会产生错误!由于取值位数的不同,有可能发送的信息要读很多次才能组合成需要的信息!1。

建立mfc工程。

将控件加进来:打开“Project->Add To Project->Components and Controls->Registered Activex Controls”,然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中。

这样就将类CMSComm 的相关文件mscomm.cpp 和mscomm.h 一并加入到了工程中。

编程时只需将控件对话中的MSComm 控件拖至你的应用对话框中就OK了2。

定义串口对象:CMSComm m_MSComm;3。

串口初始化:DWORD style=WS_VISIBLE;m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM);if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口{m_MSComm.SetPortOpen(FALSE);}m_MSComm.SetCommPort(1); //选择COM1m_MSComm.SetInBufferSize(1024); //接收缓冲区m_MSComm.SetOutBufferSize(1024);//发送缓冲区m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取m_MSComm.SetInputMode(1);//以二进制方式读写数据m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm 事件m_MSComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开m_MSComm.SetPortOpen(TRUE);//打开串口else{m_MSComm.SetOutBufferCount(0);AfxMessageBox("Open The Serial Port 1 Failurre!");}4。

串口数据读写:MSComm 类的读写函数比较简单:GetInput()和SetOutput()。

函数原形分别为VARIANT GetInput()和void SetOutput(const VARIANT newValue),均使用VARIANT类型。

但PC机发送和接收数据时习惯用字符串形式。

MSDN中查阅VARIANT类型,可以用BSTR表示字符串,但所有的BSTR都包含宽字符,而只有Windows NT支持宽字符,Windows 9X并不支持。

所以要完成一个适应各平台的串口应用程序必须解决这个问题。

这里使用CbyteArray即可解决之。

发数据:在对话框对加入按钮控件并给你添加消息void CTest_mscommDlg::OnSend(){// TODO: Add your control notification handler code hereint i,Count;CString m_SendData;m_SendData="Hello!";Count=m_SendData.GetLength();CByteArray m_Array;m_Array.RemoveAll();m_Array.SetSize(Count);for(i=0;i<count;i++){m_Array.SetAt(i,m_SendData[i]);m_MSComm.SetOutput(COleVariant(m_Array));}收数据:给串口控件添加消息void CTest_mscommDlg::OnOnCommMscomm(){VARIANT m_input;char *str,*str1;int k,nEvent,i;CString str2,m_RcvData;nEvent=m_MSComm.GetCommEvent();switch(nEvent){case 2:k=m_MSComm.GetInBufferCount(); //接收缓冲区的字符数目if(k>0){m_input=m_MSComm.GetInput();str=(char*)(unsigned char*)m_input.parray->pvData;}i=0;str1=str;while(i {i++;str1++;}*str1='{post.content}';str2=(const char*)str; //清除字符串中的不必要字符m_RcvData=(const char *)str;}//数据显示处理m_disp+=m_RcvData;UpdateData(false);}、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@网上一个家伙的例子首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。

相关文档
最新文档