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属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。常量值描述ComEventBreak1001收到了断开信号ComEventCTSTO1002ClearToSendTimeout。在发送字符时,在系统指定的事1件内,CTS(ClearToSend)线是低电平ComEventDSRTO1003DataSetReadyTimeout。在发送字符时,在系统指定的事件内,DSR(DataSetReady)线是低电平ComEventFrame1004数据帧错误。硬件检测到一个数据帧错误ComEventOverrun1006端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丢失ComEventCDTO1007CarrierDetectTime。在发送字符时,在系统指定的事件内,CD(CarrierDetect)线是低电平。CD也称为RLSD(ReceiveLineSingalDetect,接收线信号检测)ComEventRxOver1008接收缓冲区溢出。在接收缓冲区中没有空间ComEventRxParity1009奇偶校验错。硬件检测到奇偶校验错误7ComEventTxFull1010发送缓冲区满。在对发送字符排队时,发送缓冲区满ComEventDCB1011检取端口DCB(DeviceControlBlick)时发生了没有预料到的错误通信事件包含了下面的设置:常量值描述ComEvSend1发送缓冲区中的字符数比Sthreshold值低ComEvReceive2接收到了Rthreshold个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据ComEvCTS3CTS(ClearToSend)线改变ComEvDSR4DSR(DataSetReady)线改变。当DSR从1到0改变时,该事件发生ComEvCD5CD(CarrierDetect)线改变ComEvRing6检测到响铃信号。一些URAT(UniversalAsynchronousReciver--Transmitters,通用异步收发器)不支持该事件ComEvEOF7收到了EOF字符(ASCII字符26)Error消息(MSComm控件)下表列出了MSComm控件可捕获的错误消息:常量值描述ComInvalidPropertyValue380无效的属性值ComSetNotSupported383属性只读ComGetNotSupported394属性只读ComPortOpen8000端口打开时该存在无效8001超时设置必须比0值大ComPortInvalid8002无效的端口号8003属性只在运行时有效8004属性在运行时是只读的ComPortAleadyOpen8005端口已经打开8006设备标识符无效或不支持8007不支持设备的波特率8008指定的字节大小无效8009缺省参数错误8010硬件不可用(被其他设备锁住)8011函数不能分配队列ComNoOpen8012设备没有打开8013设备已经打开8014不能使用通信通知ComSetCommStateFailed8015不能设置通信状态8016不能设置通信事件屏蔽ComPortNotOpen8018该存在只在端口打开是有效8019设备忙ComReadError8020通信设备读错误ComDCBError8021检取端口设备控制块时出现内部错误注意在使用的时候一定要保证两个通讯串口的设置是相同的,否则受到的信息将会产生错误!由于取值位数的不同,有可能发送的信息要读很多次才能组合成需要的信息!1。建立mfc工程,都会撒。将控件加进来:打开“Project-AddToProject-ComponentsandControls-RegisteredActivexControls”,然后选择控件:MicrosoftCommunicationControl,version6.0插入到当前的工程中。这样就将类CMSComm的相关文件mscomm.cpp和mscomm.h一并加入到了工程中。编程时只需将控件对话中的MSComm控件拖至你的应用对话框中就OK了2。定义串口对象:CMSCommm_MSComm;3。串口初始化:DWORDstyle=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(OpenTheSerialPort1Failurre!);}4。串口数据读写:MSComm类的读写函数比较简单:GetInput()和SetOutput()。函数原形分别为VARIANTGetInput()和voidSetOutput(constVARIANTnewValue),均使用VARIANT类型。但PC机发送和接收数据时习惯用字符串形式。MSDN中查阅VARIANT类型,可以用BSTR表示字符串,但所有的BSTR都包含宽字符,而只有WindowsNT支持宽字符,Windows9X并不支持。所以要完成一个适应各平台的串口应用程序必须解决这个问题。这里使用CbyteArray即可解决之。发数据:在对话框对加入按钮控件并给你添加消息voidCTest_mscommDlg::OnSend(){//TODO:Addyourcontrolnotificationhandlercodehereinti,Count;CStringm_SendData;m_SendData=Hello!;Count=m_SendData.GetLength();CByteArraym_Array;m_Array.RemoveAll();m_Array.SetSize(Count);for(i=0;im_Array.SetAt(i,m_SendData[i]);m_MSComm.SetOutput(COleVariant(m_Array));}收数据:给串口控件添加消息voidCTest_mscommDlg::OnOnCommMscomm(){VARIANTm_input;char*str,*str1;intk,nEvent,i;CStringstr2,m_RcvData;nEvent=m_MSComm.GetCommEvent();switch(nEvent){case2:k=m_MSComm.GetInBufferCount();//接收缓冲区的字符数目if(k0){m_input=m_MSComm.GetInput();str=(char*)(unsignedchar*)m_input.parray-pvData;}i=0;str1=str;while(i){i++;str1++;}*str1='{post.content}';str2=(constchar*)str;//清除字符串中的不必要字符m_RcvData=(constchar*)str;}//数据显示处理m_disp+=m_RcvData;UpdateData(false);}目次控件两种处理通讯的方式MSComm控件两种处理通讯的方式CommPort属性RThreshold属性CTSHolding属性SThreshold属性CDHolding属性DSRHolding属性Settings属性InputLen属性EOFEnable属性Handshake常数OnComm常数InputMode常数错误消息MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。MicrosoftCommunicControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信ations编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。控件两种处理通讯的方式1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。1.1事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。OnComm事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。1.2查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEv