VBVBVBVB中MSCommMSCommMSCommMSComm控件使用详解VB中MSComm控件使用详解MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。MicrosoftCommunicationsControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。1.1事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。OnComm事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。1.2查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。2.MSComm控件的常用属性MSComm控件有很多重要的属性,但首先必须熟悉几个属性。CommPort设置并返回通讯端口号。Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。PortOpen设置并返回通讯端口的状态。也可以打开和关闭端口。Input从接收缓冲区返回和删除字符。Output向传输缓冲区写一个字符串。下面分别描述:CommPort属性设置并返回通讯端口号。语法object.CommPort[=value]CommPort属性语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。value一整型值,说明端口号。说明在设计时,value可以设置成从1到16的任何数(缺省值为1)。但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。警告必须在打开端口之前设置CommPort属性。数据类型IntegerSettings属性设置并返回波特率、奇偶校验、数据位、停止位参数。语法object.Settings[=value]Settings属性语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。value字符串表达式,说明通讯端口的设置值,如下所述。说明当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值)。Value由四个设置值组成,有如下的格式:BBBB,P,D,SBBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。value的缺省值是:9600,N,8,1下表列出合法的波特率:设置值110300600120024009600(缺省)1440019200288003840056000128000256000下表说明合法的奇偶校验值。设置值描述E偶数(Even)M标记(Mark)N缺省(Default)NoneO奇数(Odd)S空格(Space)下表列出合法的数据位值。设置值45678(缺省)下表列出合法的停止位值。设置值1(缺省)1.52数据类型StringSettings示例下面的例子设置控件端口通讯,波特率9600,无奇偶校验检查,8个数据位,1个停止位:MSComm1.Settings=9600,N,8,1PortOpen属性设置并返回通讯端口的状态(开或关)。在设计时无效。语法object.PortOpen[=value]PortOpen属性语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。value布尔表达式,说明通讯端口的状态。设置值value设置值是:设置值描述True端口开False端口关说明设置PortOpen属性为True打开端口。设置为False关闭端口并清除接收和传输缓冲区。当应用程序终止时,MSComm控件自动关闭串行端口。在打开端口之前,确定CommPort属性设置为一个合法的端口号。如果CommPort属性设置为一个非法的端口号,则当打开该端口时,MSComm控件产生错误68(设备无效)。另外,串行端口设备必须支持Settings属性当前的设置值。如果Settings属性包含硬件不支持的通讯设置值,那么硬件可能不会正常工作。如果在端口打开之前,DTREnable或RTSEnable属性设置为True,当关闭端口时,该属性设置为False。否则,DTR和RTS线保持其先前的状态。数据类型BooleanPortOpen属性示例下例以波特率9600打开1号通讯端口,没有奇偶检查,8个数据位,1个停止位。MSComm1.Settings=9600,n,8,1MSComm1.CommPort=1MSComm1.PortOpen=TrueInput属性返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。语法object.InputInput属性语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。说明InputLen属性确定被Input属性读取的字符数。设置InputLen为0,则Input属性读取缓冲区中全部的内容。InputMode属性确定用Input属性读取的数据类型。如果设置InputMode为comInputModeText,Input属性通过一个Variant返回文本数据。如果设置InputMode为comInputModeBinary,Input属性通过一个Variant.返回一二进制数据的数组。数据类型VariantInput属性示例该例子说明如何从接收缓冲区读取数据。PrivateSubCommand1_Click()DimInStringasString'读取所有可用数据。MSComm1.InputLen=0'检查数据。IfMSComm1.InBufferCountThen'Readdata.InString=MSComm1.InputEndIfEndSubOutput属性往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。语法object.Output[=value]Output属性语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。value要写到传输缓冲区中的一个字符串。说明Output属性可以传输文本数据或二进制数据。用Output属性传输文本数据,必须定义一个包含一个字符串的Variant。发送二进制数据,必须传递一个包含字节数组的Variant到Output属性。正常情况下,如果发送一个ANSI字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null字符等等的数据,要以二进制形式发送。数据类型VariantOutput属性示例下面的例子说明如何将用户键入的每一个字符送到串行端口:PrivateSubForm_KeyPress(KeyAsciiAsInteger)DimBufferasVariant'设置并打开窗口MSComm1.CommPort=1MSComm1.PortOpen=TrueBuffer=Chr$(KeyAscii)MSComm1.Output=BufferEndSubOnComm事件无论何时当CommEvent属性的值变化时,就产生OnComm事件,标志发生了一个通讯事件或一个错误。语法PrivateSubobject_OnComm()OnComm事件语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。说明CommEvent属性包含实际错误或产生OnComm事件的数码。注意,设置Rthreshold或Sthreshold属性为0,分别使捕获comEvReceive和comEvSend事件无效。OnComm事件示例下例说明如何处理通讯错误和事件。可以在相关的Case语句之后插入代码来处理特定的错误或事件。PrivateSubMSComm_OnComm()SelectCaseMSComm1.CommEvent'Handleeacheventorerrorbyplacing'codebeloweachcasestatement'错误CasecomEventBreak'收到Break。CasecomEventCDTO'CD(RLSD)超时。CasecomEventCTSTO'CTSTimeout。CasecomEventDSRTO'DSRTimeout。CasecomEventFrame'FramingErrorCasecomEventOverrun'数据丢失。CasecomEventRxOver'接收缓冲区溢出。CasecomEventRxParity'Parity错误。CasecomEventTxFull'传输缓冲区已满。CasecomEventDCB'获取DCB时意外错误'事件CasecomEvCD'CD线状态变化。CasecomEvCTS'CTS线状态变化。CasecomEvDSR'DSR线状态变化。CasecomEvRing'RingIndicator变化。CasecomEvReceive'收到RThreshold#ofchars.CasecomEvSend'传输缓冲区有Sthreshold个字符'CasecomEvEof'输入数据流中发现EOF字符EndSelectEndSubCommEvent属性返回最近的通讯事件或错误。该属性在设计时无效,在运行时为只读。语法object.CommEventCommEvent属性语法包括下列部分:部分描述object对象表达式,其值是“应用于”列表中的对象。说明只要有通讯错误或事件发生时都会产生OnComm事件,CommEvent属性存有该错误或事件的数值代码。要确定引发OnComm事件的确切的错误或事件,请参阅CommEvent属性。CommEvent属性返回下列值之一来表示不同的通讯错误或事件。这些常数可以在该控件的对象库中找到。通讯错误包括下列设置值:常数值描述comEventBreak1001接收到一个中断信号。comEventCTSTO1002ClearToSend超时。在系统规定时间内传输一个字符时,ClearToSend线为低电平。comEventDSRTO1003DataSetReady超时。在系统规定时间内传输一个字符时,DataSetReady线为低电平。comEventFrame1004帧错误。硬件检测到一帧错误。comEventOverrun1006端口超速。没有在下一个字符到达之前从硬件读取字符,该字符丢失。comEventCDTO1007载波检测超时。在系统规定时间内传输一个字符时,CarrierDetect线为低电平。CarrierDetect也称为ReceiveLineSignalDetect(RLSD)。comEventRxOver1008接受缓冲区溢出。接收缓冲区没有空间。comEventRxParity1009奇偶校验。硬件检测到奇偶校验错误comEven