MSComm控件实现串口通信的方法碧峰晨曦摘要:详细介绍了MSComm控件,并在VC++6.0中利用MSComm控件开发了基于对话框的串口通信实例。关键词:串口通信,MSComm,VC++图书编号:TP3110.引言串口通信具有实现简单、价格低廉、通信稳定、数据传输可靠等优点,因而广泛应用于各种工业控制系统中。MSComm控件是微软公司开发的专门用于串口通信的控件。该控件为开发串口通信程序提供了更加快捷、容易的方法。在VC++中,对控件属性的操作都是通过特定的函数来实现的,这些函数都是CMSComm类的成员函数。当声明了一个CMSComm类对象后,就可以通过如下格式调用成员函数来访问控件属性了:对象名.成员函数名(参数表)或对象名-成员函数名(参数表)1.MSComm控件属性及事件1.1MSComm控件属性MSComm控件有许多属性,最主要的几个属性如下:1)CommPort:设置该属性值可以获取当前程序使用的串口编号。2)Setting:设置或者获取串行通信的通信参数(包括波特率、奇偶校验类型、数据位数及停止位数等)。3)PortOpen:设置该属性可以打开或关闭串口。4)Input:从接收缓冲区中返回并删除数据。5)Output:向串口通信输出缓冲区写入数据。6)CommEvent:当MSComm控件在运行时发生错误或产生各种事件时,向程序返回错误或事件类型。1.2MSComm控件的事件该控件只有一个事件,即OnComm事件。当CommEvent属性值发生变化时就会触发OnComm事件。根据CommEvent属性值来分别执行各种情况下的处理程序。2MSComm控件实例应用2.1插入MSComm控件在VC++6.0中新建一个基于对话框的工程,命名为Test。默认情况下,VC++6.0中不会包含MSComm控件,所以需要我们手动将MSComm控件加载到VC++6.0中。(1)单击主菜单project的子菜单AddToproject的ComponentsandControls选项;(2)在弹出的“ComponentsandControlsGallery”对话框中选择RegisteredActiveXControls文件夹中的“MicrosoftCommunicationsControl,version6.0”选项,如图l:图1.插入MSComm控件单击其中的“Insert’’按钮,MSComm控件就被增加到工程中了。与此同时,类CMSComm的相关文件mscomm.h和mscomm.cpp也一并被加人Project的HeaderFiles和SourceFiles中。为了使用MSComm控件,将MSComm控件拖入对话框。在使用控件编程前还需创建该控件的实例,使用使用ClassWizard添加对话框类CTestDlg的WM_CREATE消息响应函数OnCreate(LPCREATESTRUCTlpCreateStruct),在该函数内创建控件实例:intCTestDlg::OnCreate(LPCREATESTRUCTlpCreateStruct){……//TODO:AddyourspecializedcreationcodehereDWORDstyle=WS_VISIBLE|WS_CHILD;if(!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1)){AfxMessageBox(创建MSComm控件失败!);return-1;}return0;}2.2串口初始化及打开初始化主要完成串口的通信参数设置,设置好参数后就可以打开串口了。在对话框的头文件Test.h中最顶行,加入引用控件类的代码:#includemscomm.h然后,在对话框类的定义代码中加入CMSComm类变量的声明:CMSCommmycomm;在CTestDlg::OnInitDialog()函数中添加串口初始化代码:BOOLCTestDlg::OnInitDialog(){……myComm.SetCommPort(2);//选择COM2myComm.SetSettings(9600,n,8,1);//波特率9600,无校验,8个数据位,1个停止位myComm.SetInBufferSize(2048);//指定接收缓冲区大小myComm.SetInBufferCount(0);//清空接收缓冲区myComm.SetInputMode(1);//设置数据获取方式myComm.SetInputLen(0);//设置每次读取长度myComm.SetRThreshold(1);//设置接收OnComm事件门限值myComm.SetOutBufferSize(1024);//设置发送缓冲区大小myComm.SetOutBufferCount(0);//清空发送缓冲区myComm.SetSThreshold(1);//设置发送OnComm事件门限myComm.SetPortOpen(1);//打开串口returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}2.3OnComm事件处理MSComm控件一般用OnComm事件来接收数据。使用ClassWizard加MSComm控件的OnComm消息响应函数OnOnCommMscomm(),该函数的作用为接收数据,其代码如下:voidCTestDlg::OnOnCommMscomm(){//TODO:AddyourcontrolnotificationhandlercodehereVARIANTinput1;//定义VARIANT类型变量BYTErxdata[2048];//定义存放二进制数据的数组longlen1,k;COleSafeArraysafearray1;//定义COleSafeArray类的实例CStringstrDis;switch(myComm.GetCommEvent()){case2://收到RThreshold个字符//添加接收处理代码input1=myComm.GetInput();//将VARAIANT变量赋值给COleSafeArray类的实例safearray1=input1;//使用COleSafeArray类的成员函数获取数据长度len1=safearray1.GetOneDimSize();for(k=0;klen1;k++)//使用COleSafeArray类的成员函数将数据写入数组safearray1.GetElement(&k,rxdata+k);for(k=0;k1;k++){strDis+=rxdata[k];m_Edit1.SetSel(1000000,1000000);m_Edit1.ReplaceSel(strDis);strDis=|;UpdateData(false);}}}2.4串口发送数据在对话框上添加一个“发送”按钮,利用ClassWizard为该按钮添加“BN_CLICKED”消息处理函数onsend(),实现的功能为通过串口发送数据,该函数的代码为:voidCTestDlg::OnSend(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);CByteArraysendArr;WORDwLength;wLength=m_Edit2.GetLength();//m_Edit2为与文本框联系在一起的CString型成员变量sendArr.SetSize(wLength);for(inti=0;iwLength;i++){sendArr.SetAt(i,m_Edit2.GetAt(i));}myComm.SetOutput(COleVariant(sendArr));}2.5程序测试运行程序,在发送编辑框中随意输入点什么,单击发送按钮,在另一端利用串口调试助手实现通信数据的接收和发送。程序运行情况如图2。图2.程序测试3.结束语本文介绍了详细介绍了在VC++6.0中利用MSComm控件实现串口通信的过程,并给出了详细的编程代码。该方法快速、简单,免去了以往利用WindowsAPI实现串口通信的复杂编程,具有很强的使用性。[参考文献](References)[1]王坤,高贇.基于VC++实现串口通信的方法[J].信息化研究,2010,36(10):52-54[2]刘书智,李琳娜.VisualC++实践与提高--串口通信与工程应用篇[M].北京:中国铁道出版社,2009[3]吉翔,李永全.VC++下MSComm控件的串口通信方法[J].电脑开发与应用,2009,22(12):34-36[4]张瑞卿,胡爱军,张超.基于VC++的PC机与PLC串口通讯的实现[J].设计与研究,2010年第9期:58-61