使用VB中的MSComm控件实现串口通信_第1页
使用VB中的MSComm控件实现串口通信_第2页
使用VB中的MSComm控件实现串口通信_第3页
使用VB中的MSComm控件实现串口通信_第4页
使用VB中的MSComm控件实现串口通信_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、使用vb中的mscomm控件实现rs-232串口通信实验准备:需要准备一些与串口通信有关的设备,如(外置式)调制解调器、计算机串口与调制解调器的连接线、一根dte到dte的无调制解调器连接线(接法见本章有关习题的参考答案),在实验前检查计算机的两个串口是否能够正常工作。实验环境:windows 95/98操作系统,microsoft vb 5.0以上程序设计环境。对例题中涉及调制解调器的内容,采用计算机与调制解调器连接的方式;对在例题中设计数据传输的内容,须事先将dte到dte的无调制解调器连接线的两端,分别插入com1和com2串口。实验说明:vb中的mscomm控件通过串行端口传输和接收数

2、据,为应用程序提供串行通讯功能。mscomm控件提供下列两种处理通讯的方式:(1)事件驱动(实时)方式,这是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在carrier detect(cd)或requesttosend(rts)线上一个字符到达或一个变化发生时。在这些清况下,可以利用mscomm控件的oncomm事件捕获并处理这些通讯事件。oncomm事件还可以检查和处理通讯错误。(2)轮询方式,在程序的每个关键功能之后,可以通过检查commevent属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个

3、简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“ok”响应。每个使用的mscomm控件都对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个mscomm控件。可以在windows“控制面板”中改变端口地址和中断地址。下面这个简单的例子采用了轮询方法演示了用调制解调器进行基本的串行通讯:private sub form_load()dim instring as string保存输入子串的缓冲区mscomm1.commport=3使用com3。mscomm1.settings=2400,n,8,12400波特率,无奇偶校验,8位数据位

4、,一位停止位mscomm1.inputlen0当输入占用时,告诉控件读人整个缓冲区。mscomm1.portopentrue打开端口。mscomm1.output=at+chr$(13)将调制解调器的attention命令送到调制解调器。do等待数据返回到串行端口。doeventsloop until mscomm1.inbuffercount=2instringmscomm1.input从串行端口读”ok“响应。进行相应的处理,这里省略mscomm1portopenfalse关闭串行端口。end sub下面我们将讲述一下mscomm控件的所有属性,其中前5个是最基本的,必须首先掌握。msco

5、mm控件属性1) commport,设置并返回通讯端口号。语法为:object.commport=value说明:value一为一个整型值,说明端口号。在设计时,va1ue可以设置成从1到16的任何数(缺省值为1)。但是如果用portopen属性打开一个并不存在的端口时,mscomm控件会产生错误68(设备无效)。注意:必须在打开端口之前设置commport属性的值。2) settings,设置并返回波特率、奇偶校验、数据位、停止位参数。语法为:0bject.settingsvalue说明:value一为字符串表达式,说明通讯端口的设置值。value由四个设置值组成,其格式如下:“bbbb,p

6、,d,s”,其中:bbbb为波特率,p为奇偶校验,d为数据位数,s为停止位数。value的缺省值:”9600,n,8,1”3) portopen,设置并返回通讯端口的状态(开或关)。在设计时无效。语法为:object.portopenvalue说明:value一为布尔表达式,说明通讯端口的状态。value的取值为:true端口开,false一端口关注意:设置portopen属性为true时打开端口。设置为false时关闭端口并清除接收和传输缓冲区。当应用程序终止时,mscomm控件自动关闭串行端口。串行端口设备必须支持settings属性当前的设置值。如果settings属性包含硬件不支持的通

7、讯设置值,那么硬件可能不会正常工作。如果在端口打开之前,dtrenable或rtsenable属性设置为true,当关闭端口时,该属性设置为false。否则,dtr和rts线保持其先前的状态。下例以波特率2400打开4号通讯端口,没有奇偶检查,7个数据位,1。5个停止位:mscomm1.settings=2400,n,7,1.5mscomm1.commport=4mscomm1.portopen=true4) input,返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。语法为:object.input说明:inputlen属性确定被input属性读取的字符数。设置input

8、len为0,则input属性读取缓冲区中全部的内容。inputmode属性确定input属性读取的数据类型。如果设置inputmode为comlnputmodetext,则input属性通过一个variant返回文本数据。如果设置inputmode为cominputmodebinary,input属性通过一个variant返回一二进制数据的数组。例:这个例子说明如何从接收缓冲区读取数据:private sub cmdreceive_click()dim instring as stringmscomm1.inputlen=0读取所有可用数据。if mscomm1.inbuffercount t

9、hen检查数据。instringmscomm1.input 读入数据end ifend sub5) output,往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。语法为:object.output=value说明:value一为准备写到传输缓冲区中去的一个字符串。output属性可以传输文本数据或二进制数据。用output属性传输文本数据,必须定义一个包含一个字符串的variant。发送二进制数据,必须传递一个包含字节数组的variant到output属性。一般情况下,如果发送一个ansi字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌人控制字符、null字符等等的数据,要

10、以二进制形式发送。例:这个例子说明如何将用户键人的每一个字符送到串行端口:private sub form_keypress(keyascii as lnteger)dim buffer as variantmscomm1.commport=1 设置并打开端口mscomm1.portopen=true bufferchr$(keyascii)mscomm1.output=bufferend sub6) break,设置或清除中断信号的状态。该属性在设计时无效。7) cdholding,通过查询载波侦听carrierdetect(cd)线的状态确定当前是否有传输。carrierdetect是从调

11、制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。8) commevent,返回最近的通讯事件或错误。该属性在设计时无效,在运行时为只读。9) commid,返回一个说明通讯设备的句柄。该属性在设计时无效,在运行时为只读。说明:该值与windows api createfile函数返回的值一致。在windowsapi中调用任何通讯例程时使用该值。10) ctsholding,确定是否可通过查询cleartosend(cts)线的状态发送数据。c1ear to send是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时

12、为只读。11) dsrholding,确定datasetready(dsr)线的状态。data set ready信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。12) dtrenable,确定在通讯时是否使dataterminalready(dtr)线有效。data terminal ready是计算机发送到调制解调器的信号,指示计算机在等待接受传输。13) eofenable,eofenable属性确定在输入过程中mscomm控件是否寻找文件结尾(eof)字符。如果找到eof字符,将停止输入并激活oncomm事件,此时commevent属性设置为co

13、meveof。14) handshaking,设置井返回硬件握手协议。语法为:object.handshaking=value说明:value一为整型表达式,说明握手约定。value的取值为:常数值说明comnone0(缺省)没有握手comxonxoff .1(xon/xoff)握手comrts2rts/cts (request to send/clear to send)握手comrtsxonxoff3request to send 和 xon/xoff皆可handshaking是指内部通讯协议,通过该协议,数据从硬件端口传输到接收缓冲区。当一个数据字符到达串行端口,通讯设备就把它移到接收缓

14、冲区以使程序可以读它。如果没有接受缓冲区,程序需要直接从硬件读取每一个字符,这很可能会造成数据丢失,因为字符到达的速度可以非常快。握手协议保证在缓冲区过载时数据不会丢失,缓冲区过载为数据到达端口太快而使通讯设备来不及将它移到接收缓冲区。15) inbuffercount,返回接收缓冲区中等待的字符数。该属性在设计时无效。说明:inbuffercount是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。可以把inbuffercount属性设置为0来清除接收缓冲区。16) inbuffersize,设置并返回接收缓冲区的字节数。说明:inbuffersize是指整个接收缓冲区的大小。缺省值是

15、1024字节。注意:接收缓冲区越大则应用程序可用内存越小。但若接受缓冲区太小,若不使用握手协议。就可能有溢出的危险。一般的规律是,首先设置一个1024字节的缓冲区。如果出现溢出错误,则通过增加缓冲区的大小来控制应用程序的传输速率。17) inputlen,设置并返回input属性从接收缓冲区读取的字符数。说明:inputlen属性的缺省值是0。设置inputlen为0时,使甩input将使mscolnm控件读取接收缓冲区中全部的内容。若接收缓冲区中inputlen字符无效,1nput。属性返回一个零长度字符串()。在使用input前,用户可以选择检查inbuffereount属性来确定缓冲区中

16、是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。例:这个例子说明如何读取25个数据字符:private cmdread_click()dim commdata as stringmscomm11nputlen25 确定一个25个字符的数据块。commdatamscomm1.input读数据。end sub18) inputmode,设置或返回input属性取回的数据的类型。说明:inputmode属性确定input属性如何取回数据。数据取回的格式或是字符串或是一数据组的二进制数据的数组。若数据只用ansi字符集,则用cominputmodetext。对其它字符数据

17、,如数据中有嵌入控制字符、nulls等等,则使用cominputmodebinary。19) nulldiscard,确定null字符是否从端口传送到接收缓冲区。20) outbufferrcount,返回在传输缓冲区中等待的字符数。也可以用它来清除传输缓冲区。该属性在设计时无效。说明:设置outbuffercount属性为0可以清除传输缓冲区。21) outbuffersize,以字节的形式设置并返回传输缓冲区的大小。说明:outbuffersize指整个传输缓冲区的大小:缺省值是512字节。传输缓冲区设置的越大则应用程序可用内存越小。但若缓冲区太小,若不使用握手协议,就可能有溢出的危险。一

18、般的规律是,首先设置一个512字节的缓冲区。如果出现溢出错误,则通过增加缓冲区的大小来控制应用程序的传输速率。22) parityreplace,当发生奇偶校验错误时,设置并返回替换数据流中一个非法字符的字符。说明:缺省的情况是,mscomm控件用问号(?)替换非法字符。如果设置parityrep1ace为一个空字符串(),则当奇偶校验错误出现时,字符替换无效。但oncomm事件仍然产生,并且设置commevent。属性为comeventrxparity。parityreplace字符被用于面向字节的操作,它必须是单字节字符。可指定0到255之间的任何ansi字符代码。23) rthresho

19、ld,在mscoinm控件设置commevent属性为comevreceive,并产生oncomm事件之前,设置并返回的要接收的字符数。24) rtsenable,确定是否使requestrosend(rts)线有效。一般情况下,由计算机发送requesttosend信号到联接的调制解调器,以请示允许发送数据。25) sthreshold,在mscomm控件设置。commevent属性为comevsend并产生oncomm事件之前,设置并返回传输缓冲区中允许的最小字符数。事件1) oncomm,无论何时当commevent属性的值变化时,就产生oncomm事件,它标志发生了一个通讯事件或一个错

20、误。说明:commevent属性包含实际错误或产生oncomm事件的编码。但是,当rthresho1d或sthreshold属性被设置为0时,则会分别使comevreceive和comevsend事件无效。使用轮询方式实现串口通信工程名称:mscomm_show1.vbp发送窗体名称:mscomm_send1.frm接收窗体名称:mscomm_receive_polling.frm控件及属性设置:对象名称属性对象名称属性mscomm_sendcaption: mscomm_sendmscomm_receive_pollingcaption: mscomm_receive_pollinglabe

21、l1caption:发送窗口label1caption:接收窗口label2caption: 请将发送内容写入文本框label2caption: 接收到的文本将在文本框中显示text1text:text1text:mscomm1macomm1程序代码:发送窗体程序private sub form_load() mscomm1.commport = 1 使用com1。 mscomm1.settings = 2400,n,8,1 2400波特率,无奇偶校验,8位数据位,一位停止位 mscomm1.inputlen = 0 当输入占用时,告诉控件读人整个缓冲区。 mscomm1.portopen =

22、 true 打开端口。 mscomm_receive_polling.show 显示轮询接收窗体,启动接收程序end subprivate sub text1_keypress(keyascii as integer) mscomm1.output = chr$(keyascii) 发送用户从键盘上输入的字符end subprivate sub form_unload(cancel as integer) mscomm1.portopen = false 关闭串行端口end sub接收窗体程序private sub form_load() mscomm1.commport = 2 使用com2

23、。 mscomm1.settings = 2400,n,8,1 mscomm1.inputlen = 0 mscomm1.portopen = true end subprivate sub form_click() text1.text = mscomm1.input 从串行端口读内容。end subprivate sub form_unload(cancel as integer) mscomm1.portopen = falseend sub实验操作步骤:1) 用发送窗体(mscomm_send)作为启动对象,启动程序后,发送窗体和轮询接收窗体都将出现在屏幕上;2) 用鼠标将光标设置到发

24、送窗体的文本框中,在文本框中输入字母或数字,观察接受窗口的文本框有无变化;3) 移动鼠标光标单击接收窗体,接收窗体由deactivate成为一个activate状态,再观察接收窗体的文本框有什么变化,请考虑一下程序执行的过程和轮询方式的工作原理。使用事件驱动(实时)方式实现串口通信工程名称:mscomm_show2.vbp发送窗体名称:mscomm_send2.frm接收窗体名称:mscomm_receive_realtime.frm控件及属性设置:对象名称属性对象名称属性mscomm_sendcaption: mscomm_sendmscomm_receive_pollingcaption: mscomm_receive_realtimelabel1caption:发送窗口label1caption:接收窗口label2caption: 请将发送内容写入文本框label2caption: 接收到的文本将在文本框中显示text1text:text1text:mscomm1macomm1rthreshold:1程序代码:发送窗体程序private sub form_load() mscomm1.commport = 1 mscomm1.settings = 2400,n,8,1 ms

温馨提示

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

评论

0/150

提交评论