基于VB 6.0的串口通讯程序设计
摘 要: 详细介绍了VB6.o中通讯控件MSComm的一些重要属性及在Windows环境下用通讯控件来实现串行通信的编程方法,并结合实例给出了一个基本的通讯程序。
关键词:串行通信;通信控件;Visual Basic 6.0
1 引言
vs编程软件随着计算机的迅速普及和计算机控制技术的发展,计算机被广泛应用于自动化控制领域之中。而要完成一个控制过程一般都要利用集散式计算机控制系统。在这种控制系统中,下位机主要完成对现场数据采集和对设备一级的监控,上位机则要完成对整个系统的采集、分析、处理和控制以及数据、图形显示、打印、人机对话等工作。而上位机与下位机大多是通过PC机的RS-232串行接口实现通信。随着Windows系统的普及,越来越多的用户由DOS系统转向了Windows系统,这使得数据采集及工业控制软件也上升到了Windows环境下。这就给程序员提出了如何编写面向Windows的串行通信程序问题。
虽然Windows提供了完备的开放式通用增强的W32API(应用程序接口)函数,它把对串
口和其他通信设备的支持和基本输入驱动程序集于一体。但是,对于非专业软件设计人员来说,使用VC++,C等高级语言来完成这类程序的设计,其复杂性与专业化程度依然很高。
而Visual Basic 6.0(以下简称VB)是一个Windows下简单、易学、高效的可视化软件开发平台,它以所见即所得的可视化界面设计风格和32位面向对象程序设计的特点,已被广泛应用到各个领域,成为众多开发人员采用的工具。VB不但提供了良好的界面设计能力,而且在串口通信方面也有很强的功能。它提供的Microsoft Communication control(以下简称MSComm)这样一个通信控件,该控件“隐藏”了大部分串口通信的低层运行过程和许多繁琐的过程,它使用户能够方便地访问Windows下串口通信驱动程序的大多数特性。所以整个串行通信程序的开发过程变得十分简单易行,程序员不需要处理繁琐的细节,而通过利用通信控件,只需编写少量的代码来实现主要应用功能和界面的设计,就可以完成软件的开发过程。
2 VB 6.0串行通信控件的介绍
MSComm是Microsoft公司提供的主要用于串行通信编程的ActiveX控件。ActiveX控件包
括一系列的属性、方法和事件,应用程序通过ActiveX控件提供的接口来访问控件的功能。我们知道通过C、VC++编写串口通信程序,是要使用API函数发送和接收数据。而MSComm控件实际上是这些Windows API函数的有机集成,它以属性和事件的形式提供了对Windows通信驱动程序的API接口,封装了API函数的低层操作,为应用程序提供了通过串行接口收发数据的简便方法。因此,编程人员只需在程序中设置和监视MSComm控件的属性和事件即可完成对串口的编程。
MSComm控件不在最常用的控件工具箱中出现,故编程的第一步应添加到工具栏上以方便编程。具体的做法如下:单击VB 6.0菜单栏中的“工程”菜单,并选择“部件”命令,在部件对话框种选择Microsoft Comm Control 6.0,此时工具箱应出现一个电话图表,这就是MSComm图标。
2.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(二进制数据)方式传送。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论