VB中-MSComm控件使用详解_第1页
VB中-MSComm控件使用详解_第2页
VB中-MSComm控件使用详解_第3页
VB中-MSComm控件使用详解_第4页
VB中-MSComm控件使用详解_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VB中MSComm控件使用详解VB中MSComm控件使用详解MSComm控件通过串行瑞口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。MicrosoftCommunicationsControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是査询法。MSComm控件

2、两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和査询方式。1.1事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。OnComm事件还可以检査和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent属性。在编程过程中,就可以在0nComm事件处理函数中加入自己的处理代码。这种方法的

3、优点是程序响应及时,可靠性髙。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。1.2査询方式査询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检査CommEvent属性的值来査询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的确定“响应。MSComm控件的常用属性MSComm控件有很多重要的属性,但首先必须熟悉儿个属性。CommPort设置并返回通讯端口号。S

4、ettings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。PortOpen设置并返回通讯端口的状态。也可以打开和关闭端口。Input从接收缓冲区返回和删除字符。Output向传输缓冲区写一个字符串。下而分别描述:CommPort属性设置并返回通讯端口号。语法object.CommPort=valueCommPort属性语法包括下列部分:部分描述object对彖表达式,其值是应用于列表中的对象。value一整型值,说明端口号。说明在设计时,value可以设置成从1到16的任何数(缺省值为1)。但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设

5、备无效)。警告必须在打开端口之前设置CommPort属性。数据类型IntegerSettings属性设置并返回波特率、奇偶校验、数据位、停止位参数。语法object.Settings=valueSettings属性语法包括下列部分:部分描述object对象表达式,其值是应用于列表中的对象。value字符串表达式,说明通讯端口的设宜值,如下所述。说明当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值。Value由四个设置值组成,有如下的格式:BBBBZPZDZSBBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。value的缺省值是:9600,N,8,1下表列

6、出合法的波特率:设置值110300600120024009600(缺省)1440019200288003840056000128000256000下表说明合法的奇偶校验值。设置值描述E偶数(Even)M标记(Mark)N缺省(Default)None0奇数(Odd)S空格(Space)下表列出合法的数据位值。设置值4567(缺省)下表列出合法的停止位值。设置值(缺省)1.52数据类型StringSettings示例下而的例子设置控件端口通讯,波特率9600,无奇偶校验检查,8个数据位,1个停止位:MSComml.Settings=9600,N,8,lPortOpen属性设宜并返回通讯端口的状态

7、(开或关)。在设计时无效。语法object.PortOpen=valuePortOpen属性语法包括下列部分:部分描述object对彖表达式,其值是应用于列表中的对象。value布尔表达式,说明通讯端口的状态。设置值value设置值是:设置值描述True端口开False端口关说明设置PortOpen属性为True打开端口。设置为False关闭端口并淸除接收和传输缓冲区。当应用程序终止时,MSComm控件自动关闭串行端口。在打开端口之前,确定CommPort属性设置为一个介法的端口号。如果CommPort属性设宜为一个非法的端口号,则当打开该端口时,MSComm控件产生错误68(设备无效)。另外

8、,串行端口设备必须支持Settings属性当前的设置值。如果Settings属性包含硬件不支持的通讯设置值,那么硬件可能不会正常工作。如果在端口打开之前,DTREnable或RTSEnable属性设置为True,当关闭端口时,该属性设置为False.否则,DTR和RTS线保持其先前的状态。数据类型BooleanPortOpen属性示例下例以波特率9600打开1号通讯端口,没有奇偶检査,8个数据位,1个停止位。MSComml.Settings=”9600,n,8,1”MSComm1.CommPort=1MSComml.PortOpen=TrueInput属性返回并删除接收缓冲区中的数据流。该属性

9、在设计时无效,在运行时为只读。语法object.InputInput属性语法包括下列部分:部分描述object对彖表达式,其值是应用于列表中的对象。说明InputLen属性确定被Input属性读取的字符数。设宜InputLen为0,则Input属性读取缓冲区中全部的内容。InputMode属性确定用Input属性读取的数据类型。如果设置InputMode为comInputModeText,Input属性通过一个Variant返回文本数据。如果设置InputMode为comlnputModeBinary,Input属性通过一个Variant.返回一二进制数据的数组。数据类型VariantInpu

10、t属性示例该例子说明如何从接收缓冲区读取数据。PrivateSubCommandl_Click()DimInStringasString1读取所有可用数据。MSComml.InputLen=0检査数据。IfMSComml.InBufferCountThen1Readdata.InString=MSComml.InputEndIfEndSubOutput属性往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。语法object.Output=valueOutput属性语法包括下列部分:部分描述object对彖表达式,其值是应用于列表中的对象。value要写到传输缓冲区中的一个字符串。说明Ou

11、tput属性可以传输文本数据或二进制数据。用Output属性传输文本数据,必须左义一个包含一个字符串的Variant.,发送二进制数据,必须传递一个包含字节数组的Variant到Output属性。正常情况下,如果发送一个ANSI字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null字符等等的数据,要以二进制形式发送。数据类型VariantOutput属性示例下而的例子说明如何将用户键入的每一个字符送到串行端口:PrivateSubForm_KeyPress(KeyAsciiAsInteger)DimBufferasVariant设置并打开窗口MSComml.CommPo

12、rt=1MSComml.PortOpen=TrueBuffer=Chr$(KeyAscii)MSComml.Output=BufferEndSubOnComm事件无论何时当CommEvent属性的值变化时,就产生OnComm事件,标志发生了一个通讯事件或一个错误。语法PrivateSubobject_OnComm()OnComm事件语法包括下列部分:部分描述object对象表达式,其值是应用于列表中的对象。说明CommEvent属性包含实际错误或产生OnComm事件的数码。注意,设置Rthreshold或Sthreshold属性为0,分别使捕获comEvReceive和comEvSend事件无

13、效。OnComm事件示例下例说明如何处理通讯错误和事件。可以在相关的Case语句之后插入代码来处理特定的错误或事件。PrivateSubMSComm_OnComm()SelectCaseMSComml.CommEventHandleeacheventorerrorbyplacingcodebeloweachcasestatement错误收到BreaksCD(RLSD)超时。CTSTimeout01DSRTimeouto1FramingError数据丢失。接收缓冲区溢岀。Parity错误。传输缓冲区已满。获取DCB时意外错误CasecomEventBreakCasecomEventCDTOCas

14、ecomEventCTSTOCasecomEventDSRTOCasecomEventFrameCasecomEventOverrunCasecomEventRxOverCasecomEventRxParityCasecomEventTxFullCasecomEvCDCD线状态变化。CasecomEventDCBCasecomEvCTSCasecomEvDSRCasecomEvRing1CTS线状态变化。DSR线状态变化。RingIndicator变化。CasecomEvReceive收到RThreshold#ofchars.CasecomEvSend传输缓冲区有Sthreshold个字符Ca

15、secomEvEof输入数据流中发现EOF字符EndSelectEndSubCommEvent属性返回最近的通讯事件或错误。该属性在设计时无效,在运行时为只读。语法object.CommEventCommEvent属性语法包括下列部分:部分描述object对象表达式,其值是应用于列表中的对象。说明只要有通讯错误或事件发生时都会产生OnComm事件,CommEvent属性存有该错误或事件的数值代码。要确定引发OnComm事件的确切的错误或事件,请参阅CommEvent属性。CommEvent属性返回下列值之一来表示不同的通讯错误或事件。这些常数可以在该控件的对象库中找到。通讯错误包括下列设置值:

16、常数值描述comEventBreak1001接收到一个中断信号。comEventCTSTO1002ClearToSend超时。在系统规定时间内传输一个字符时,ClearToSend线为低电平。comEventDSRTO1003DataSetReady超时。在系统规左时间内传输一个字符时,DataSetReady线为低电平。comEventFrame1004帧错误。换件检测到一帧错误。comEventOverrun1006瑞口超速。没有在下一个字符到达之前从硕件读取字符,该字符丢失。comEventCDTO1007载波检测超时。在系统规立时间内传输一个字符时,CarrierDetect线为低电平

17、。CarrierDetect也称为ReceiveLineSignalDetect(RLSD)。comEventRxOver1008接受缓冲区溢出。接收缓冲区没有空间。comEventRxParity1009奇偶校验。硬件检测到奇偶校验错误comEventTxFull1010传输缓冲区已满。传输字符时传输缓冲区已满comEventDCB1011检索端口的设备控制块(DCB)时的意外错误通讯事件包括下列设置值:常数值描述comEvSend1在传输缓冲区中有比Sthreshold数少的字符。comEvReceive2收到Rthreshold个字符。该事件将持续产生直到用Input属性从接收缓冲区中删

18、除数据。comEvCTS3ClearToSend线的状态发生变化。comEvDSR4DataSetReady线的状态发生变化。该事件只在DST从1变到0时才发生。comEvCD5CarrierDetect线的状态发生变化。comEvRing6检测到振铃信号。一些UART(通用异步接收一传输)可能不支持该事件。comEvEOF7收到文件结束(ASCII字符为26)字符。数据类型IntegerMSComm控件示例下而这个简单的例子演示了用调制解调器进行基本的串行通讯:PrivateSubForm_Load()保存输入子串的缓冲区DimInstringAsString使用COMloMSComm1.C

19、ommPort=19600波特,无奇偶校验,8位数据,一个停止位。MSComml.Settings=9600,8,1当输入占用时,告诉控件读入整个缓冲区。MSComml.InputLen=0打开端口。MSComml.PortOpen=True将attention命令送到调制解调器。Chr$函数:返回String,其中包含有与指定的字符代码相关的字符MSComml.Output=ATVIQO&Chr$(13)确保调制解调器以“OK“响应。等待数据返回到串行端口。DoDoEventsBuffer$=Buffer$&MSComml.InputLoopUntilInStr(Buffer$,OK&vbC

20、RLF)从串行端口读OK响应。关闭串行端口。MSComml.PortOpen=FalseEndSub注意MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。这个简单的例子使用了伦询方法。实例1:计算机拨号在一些实际应用中经常需要使用计算机拨号。下而这个例子利用MSComm控件操作Modem进行拨号,实现串口通信。实现步骤:建窗体添加一个MSComm控件,用来建立与串口的连接:添加一个Text控件,Name属性为Txttel,用来输入电话号码;添加3个CommandButton控件,Name属性分别为DialButtonXancellButton.QuitButton,分別用来实现拨号、

21、中止拨号、中止程序:添加一个Label控件,用来显示所有与拨号有关的信息。窗体见图设置MSComm控件属性InBufferSize=1024;zInBufferSize是指整个接收缓冲区的大小。缺省值是1024字节。Inputlen=O:InputLen属性的缺省值是0。设宜InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。InputMode=0;0(缺省)数据通过Input属性以文本形式取回。1一数据通过Input属性以二进制形式取回Rthreshold=2;当接收字符后,若Rthreshold属性设置为0(缺省值)则不产生OnComm事件。RTSEnab

22、le=True:当RTSEnable设置为True,端口打开时,RequestToSend线设置为高电平,端口关闭时,设置为低电平。Settings=、9600,N,8,l;Sthreshold=Oa若设置Sthreshold属性为0(缺省值),数据传输事件不会产生OnComm事件。若设置Sthreshold属性为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。因为每一台计算机的串口使用状态都不会一样。为使程序具有通用性,在窗体的Load方法中首先进行串口测试,找到第一个可用串口后再进行设置。程序功能程序根据输入的电话号码进行拨号,Modem正常拨号后,提示用户摘机,准备通话。

23、图1电话拨号实例主要方法与事件代码设置可用串口PrivateSubForm_Load()OnErrorGoToerror_openFori=1To4MSComml.CommPort=1MSComm1.PortOpen=True设置可用的第一个串口OnErrorGoTo0ExitSuberror_resume:Nexterror_open:Resumeerror_resumeEndSubPrivateSubDialButton_Click()DimNumber$,Temp$Number$=Trim$(Txttel.Text)返回Variant(String),其中包含指定字符串的拷贝,没有前导空

24、白(LTrim).尾随空白(RTrim)或前导和尾随空白(Trim)。IfNumber$=ThenMsgBox请输入电话号码Txttel.SetFocusExitSubEndIfDialButton.Enabled=FalseQuitButton.Enabled=FalseDialString$=ATDT+Number$+vbCr淸除接收缓冲区MSComml.InBufferCount=0拨电话号码MSComml.Output=DialString$Lblmessage.Caption=正在拨号码一+Numbe$DialButton.Enabled=TrueQuitButton.Enabled

25、=TrueEndSubPrivateSubMSComml_OnComm()SelectCaseMSComml.CommEventCasecomEvReceive读取串口数据COMBUF=COMBUF+MSComml.InputIc=InStr(lzCOMBUF,、OIC)IfIc=0ThenExitSubModem已正常拨号,返回OKLblmessage.Caption=请您摘下电话机,准备通话CasecomEvSendEndSelectEndSubPrivateSubCancelButton_Click()断开与调制解调器的连接MSComml.Output=、ATH+vbCrEndSub实例

26、2:实现来电显示在一些实际应用中,需要显示并保存来电号码,并根据电话号码显示相应资料,比如小区物业管理和110报警等系统。实现步骤:创建窗体添加一个MSComm控件,用来建立与串口的连接;添加4个Option控件,用来确定使用的串口号:添加4个Label控件,用来显示来电号码及日期时间;添加一个ProgressBar控件,用来显示电话振铃次数:为方便调试程序,添加一个Text控件Text5,用来显示Modem传来的所有信息。窗体见图2。图2来电显示窗体设置MSComm控件属性InBufferSize=1024;Inputlen=O:InputMode=0:Rthreshold=l:RTSEna

27、ble=True:Settings=9600zNz8zln;Sthreshold=0o程序功能程序首先初始化Modem,然后等待来电。当有来电时,MSComm产生OnComm事件,Modem送岀的信息格式为DATE=月日回车换行TIME=时分回车换行NMBR=电话号码回车换行。在OnComm事件处理程序中对读入信息进行截取,截取电话号码后,以该电话号码为关键字,査询并显示数据库中有关信息。主要方法与事件代码通用声明部分ConstDEBFLG=1PublicCOMXZBEEPNO,HANGUP,PNLOCAsIntegerPublicCOMBUF,COMLINAsStringPrivateSub

28、Form_Load()检测串行口DimI,CAsIntegerCOMX=0COMBUF=COMLIN=BEEPNO=0HANGUP=0正常运行程序,关闭右侧Text5IfDEBFLG=0ThenForml.Width=Forml.WidthText5.WidthText5.Enabled=FalseText5.Visible=FalseEndIfOnErrorGoToERROR_FORM_LOAD检测可用串口ForC=1To4IfMSComml.PortOpenThenMSComml.PortOpen=FalseMSComml.CommPort=CIfNotMSComml.PortOpenTh

29、enMSComml.PortOpen=TrueIfMSComml.PortOpenThenMSComml.PortOpen=FalseIfCOMX=0ThenCOMX=CFORM_LOAD_1:NextCIfCOMX=0ThenEndOnErrorGoTo0Optionl(COMX一l).Value=TrueExitSubERROR_FORM_LOAD:Optionl(C1).Enabled=FalseResumeFORM_LOAD_1EndSub选择串行口PrivateSubOptionl_Click(IndexAsInteger)COMX=Index+1CallINIT_MODEMEndS

30、ub初试化ModemPrivateSubINIT_MODEM()IfMSComml.PortOpenThenMSComml.PortOpen=FalseMSComml.CommPort=COMXIfNotMSComml.PortOpenThenMSComml.PortOpen=TrueMSComml.Output=AT#CID=1+vbCr检査Modem命令是否完成CallCHKMODEMMSComml.Output=、ATS0=0+vbCrEndSub检査Modem命令是否完成PrivateSubCHK_MODEM()DimTAsSingleDimLAsIntegerT=TimerDoCOMBUF=COMBUF+MSComml.InputL=InStr(lzCOMBUF,、OK)LoopUntilL0OrTimerT1IfL=0ThenLinel.Visible=TrueLine2.Visible=TrueForml.ShowMsgBoxMODEM未联机z;vbOKOnly+v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论