您现在正在浏览:首页 > 职教文章 > 职教论文 > VB串行通信和通信程序设计

VB串行通信和通信程序设计

日期: 2010/2/22 浏览: 169 来源: 学海网收集整理 作者: 佚名

1? VB 6.0中MSComm通信控件的属性

通信控件把许多复杂的操作都留给了VB和Windows处理,编程人员编程时只需设置其中的一些属性,下面是几个常用的属性:

Commport:设定或传回通信连接端口代号。程序必须指定所要使用的串行端口的号码,Windows系统会使用所设定的通讯端口与外界做通讯。程序亦可经由此属性读回所使用的连接端口的号码。在此所设定的通讯端口由1开始往上递增,MSComm控件的最大值为16,当使用的通讯端口超过16时,控件会通知错误。

如:MSComm1Commport=1指定Com1作为通讯传输。

Settings: 设定初始化参数。以字符串型式设定或传回联机速度、同位检查、数据位、停止位等4个参数。其格式为“BBBB,P,D,S”,其中BBBB为联机速度,P为同位检查方式,D为数据位数,S为停止位数。默认值是“9600,n,8,1”,意为“所使用的通讯端口是以每秒9600 B的速度作传输,不做同位的检查,每个元是8个Bit,而停止位是1个Bit”,而且此4项必须是依照顺序,不可前后对调。

Settings设定完成以后,所送出及收回的字符串便以此设定为主,使用RS-232通讯的两方,Settings必须完全一样,彼此才能顺利地沟通,否则双方无法收到彼此所送的信号。

如:MSComm1Settings=“9600,n,8,1”

PortOpen: 设定或传回通讯接口端口的状态。使用串行端口之前必须先将使用的串行埠先行开启,而使用完毕之后,也必须执行关闭的动作。

InPut: 从输入缓冲区传回并移除字符。程序靠这个指令将从对方所传至缓冲区的字符读进程蓄洪,并清除缓冲区中已被读取得自负,这是一种FIFO的机制。

如:Buffer$=MSComm1Input 将输入缓冲区的字符读入Buffer字符串变量中Output: 将一个字符串写入传输缓冲区。 当程序需要向对方传输字符串时,可将字符串使用此指令写入输出缓冲区中。至于串行端口是否将此字符传送到对方的串行输入缓冲区中,则要视送出字符串这方是否设定传送门槛属性而定。

如:MSComm1Output=“ABCDE”,此即将ABCDE五个字母通过RS-232传送出去。

InPutLen: 指定由串行端口读入的字符串的长度。InPut指令将存放在输入暂存区的字符读入,但欲指定所读入的字符长度则需要使用本属性而设定。

如:MSComm1InPutLen=10,当程序执行Input指令时,只会读取10个字符。那什么时候使用InPutLen指令呢?如果我们需要对固定的字符串长度作特别的运算或判断时,就必须使用这个技巧。

Rthreshold:设定或传输引发接收事件的字符数。即属性页上的“最小接收字符数”,当接收缓冲区达到所设定的字符数时,将会引起OnComm事件中的接收事件。所以此属性也就是引起接收事件的“门槛值”,此属性的默认值是0,其意义是无论缓冲区中有多少字符都不引起接收事件。

如:MSComm1Rthreshold=20。当接收缓冲区达到20个字符时,引发接收事件。

Sthreshold: 设定或传回引发传送事件的字符数。如果在传输暂存缓冲区种的字符少于所设定的数值,则CommEvent属性会被设定为CommEvSend,并产生OnComm事件。

如:MSComm1Sthreshold=20。当传送缓冲区字符少于20个字符时,引起传送事件。

CommEvent: 只要有通讯错误或事件发生时都会产生OnComm事件,CommEvent属性存有该事件或错误的数值码,其中最常用到的通讯事件是CommEvReceive,它的值为2,表示收到了Rthreshold个字符。该事件将持续产生直到用Input属性从接受缓冲区移出数据。

2.2? MSComm处理通信的两种方法

MSComm控件提供了两种控制串口的方法,类似于DOS的中断和查询。

事件驱动方式OnComm事件是MSComm控件提供的唯一事件。当有数据到达端口或端口状态发生改变或有通信错误产生时,都将触发OnComm事件,以捕获和处理这些通信中产生的错误,通过查询CommEvent属性值,可以获得关于通信事件和通信错误的完整信息,进而进行处理。这是一种功能很强的处理串行口活动的方法,具有程序响应及时、可靠性高的特点。

查询法MSComm控件的CommEvent属性返回通信中产生的事件和错误类型,由通信控件自动检测和跟踪通信状态后设置。因此,在小的程序中,程序员可以在每个重要的程序功能之后检查CommEvent属性值来检测事件和通信错误。如果程序小,实时性不高,这种方法是可取的。

两种方式都可以达到数据传送的目的,到底谁较好?并没有一个定论,要看实际的系统环境而定,也许这两种方式都用得上。

2.3? MSComm控件数据通信的两种格式

我们在进行串口通信时,一般为字符传送方式。但在某些情况下传送的却不见得是纯文字形态的数据,而是数据或文件。在这种情况下,位在传输线上的数据就是一个字节接一个字节地被传送过来,接收端收到这些数据后,再与以组合形成数据资料或文件,这种情形就是Binary(二进制数据)方式传送。

对应这两种传送方式,用户可以通过对MSComm控件中的InputMode属性的设置来决定Input属性如何取回数据。数据是以字符串的形式接收还是作为字节数组中的二进制来接收,完全视此属性来决定。当InputMode取值为0时(默认值)数据以文字形式取回,当取值为1时,数据以二进制形式取回。

3? 应用举例

下面我们就来探讨一个简单的传输试验。为了方便,我们把一条RS-232串口传输线上的第2脚与第3脚短路,即从Com1的TXD引脚发送出去的数据又由Com1的RXD引脚接收回来。那么由第3脚输出的讯号就会被传送到第2脚而形成一个完整的回路,从而进入同一部计算机的输入缓冲区。程序只要再由相同的计算机上做续回的动作,即可将数据读入,一样可以形成一个测试环境。这样就达到了我们用单部计算机来模拟两部计算机进行串口通讯的目的。

本例中以二进制格式发送和接收数据。首先设计程序的界面:开启一个新的VB项目,并于窗体上安排一个MSComm控件,作为串行通讯的信道,按F4调出其属性窗口,将CommPort属性值改为1;另外将InputMode属性改为1,使其以Binary方式接收数据。

安排两个Label控件,在其Caption属性分别填入“*传送区*”和“*接收区*”作为提醒使用者之用。

安排两个文本框,分别对应到传送区与接收区,作为传送的输入区域与接收讯息的显示区域。

安排两个按钮,在其Caption属性内分别填入“传送字符”与“结束系统”。

所设计出的画面如下:



程序所实现的功能:我们希望的表现是按下“传送字符”后,送处在传送区所键入的文字及数据。当接收门槛值一达到程序员所设定的值,便会将缓冲区中的内容读如,并显示在接收区的文本框里。

程序的几个关键之处:

(1)程序将使用到两个动态数组,类型为字节(Byte),分别用于存储传送及接收数据之用。

(2)在送出数据之前,先对数据做一些处理,由于我们要传送的是字节的数据。因此,首先将输入区内的文字转换为相应的ASCⅡ码,转换后再把数据送出去。

(3)接收数据时先从缓冲区把数据读入事先定义的变量中,再从该变量中读取真正的二进位数据并显示在接收区中。

MSComm只有一个OnComm事件,所有可能发生的状况全部集中在此一事件中处理。而且只要CommEvent属性值一产生变化,就会产生OnComm事件,这表示发生了一个通讯事件或一个错误。一旦OnComm事件发生,连带地会引入CommEvent参数,使用者可以在每一个相关的Case语句之后撰写程序代码来处理特定的错误或事件。在此例中,只要Rthreshold中设定门槛值达到时,便会使得CommEvert属性值变为ComEvReceive,因此接收的子程序便被执行了。

实现的程序代码如下:



若系统建立之初不知道所传送的是字符还是字节方式的数据(例如我们要建立一个通用型的数据接受器,类似Windows操作系统的终端机程序。),比较好的方式就是本例中的方式……一律采用字节数据接受方式,如此便不会丢失任何一个数据,而收回来的数据再做必要的处理与转换即可。可见上面所讲的字节传送程序具有一定的现实意义。

4? 结语

VB 6.0具有良好的图形接口并支持面向对象的编程方法和具有结构化的事件驱动编程模式,采用VB 6.0编写程序,短时间内就可以设计出交互界面友好、功能易扩展的程序。本文对Windows环境下通过VB 6.0程序使用MSComm串行通信ActiveX控件进行编程的方法做了简单的探讨和实践。VB 6.0的通信控件功能强大、编程简单,使得Windows环境下的串口通讯程序设计变得方便易行。最后希望本文能起到抛砖引玉的目的


VB串行通信和通信程序设计

返回顶部