【VB开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了VB开源代码-基于VB_6.0的串口通讯程序设计 - 文化教育的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
基于
VB 6.0 的串口通讯程序设计摘 要: 详细介绍了
VB6.o 中通讯控件 MSComm 的一些重要属性及在 Windows 环境下用通讯控件来实现串行通信的编程方法,并结合实例给出了一个基本的通讯程序。
关键词:串行通信;通信控件;Visual Basic 6.0 1 引言 随着计算机的迅速普及和计算机控制技术的发展,计算机被广泛应用于自动化控制领域之中。
而要完成一个控制过程一般都要利用集散式计算机控制系统。
在这种控制系统中,下位机主要完成对现场数据采集和对设备一级的监控,上位机则要完成对整个系统的采集、分析、处理和控制以及数据、图形显示、打印、人机对话等工作。
而上位机与下位机大多是通过 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 Commport1 指定 Com1 作为通讯传输。
Settings: 设定初始化参数。
以字符串型式设定或传回联机速度、同位检查、数据位、停止位等 4 个参数。
其格式为“BBBBPDS”,其中 BBBB 为联机 P D S速度, 为同位检查方式, 为数据位数, 为停止位数。
默认值是“9600n81”,意为“所使用的通讯端口是以每秒 9600 B 的速度作传输,不做同位的检查,每个元是 8 个 Bit,而停止位是 1 个 Bit”,而且此 4 项必须是依照顺序,不可前后对调。
Settings 设定完成以后,所送出及收回的字符串便以此设定为主,使用RS-232 通讯的两方,Settings 必须完全一样,彼此才能顺利地沟通,否则双方无法收到彼此所送的信号。
如:MSComm1 Settings“9600 n 81” PortOpen: 设定或传回通讯接口端口的状态。
使用串行端口之前必须先将使用的串行埠先行开启,而使用完毕之后,也必须执行关闭的动作。
InPut: 从输入缓冲区传回并移除字符。
程序靠这个指令将从对方所传至缓冲区的字符读进程蓄洪,并清除缓冲区中已被读取得自负,这是一种 FIFO 的机制。
如:BufferMSComm1 Input 将输入缓冲区的字符读入 Buffer 字符串变量中 Output: 将一个字符串写入传输缓冲区。
当程序需要向对方传输字符串时,可将字符串使用此指令写入输出缓冲区中。
至于串行端口是否将此字符传送到对方的串行输入缓冲区中,则要视送出字符串这方是否设定传送门槛属性而定。
如:MSComm1 Output“ABCDE”,此即将 ABCDE 五个字母通过 RS-232 传送出去。
InPutLen: 指定由串行端口读入的字符串的长度。
InPut 指令将存放在输入暂存区的字符读入,但欲指定所读入的字符长度则需要使用本属性而设定。
如:MSComm1 InPutLen10,当
程序执行 Input 指令时,只会读取 10 个字符。
那什么时候使用 InPutLen 指令呢?如果我们需要对固定的字符串长度作特别的运算或判断时,就必须使用这个技巧。
Rthreshold:设定或传输引发接收事件的字符数。
即属性页上的“最小接收字符数”,当接收缓冲区达到所设定的字符数时,将会引起 OnComm 事件中的接收事件。
所以此属性也就是引起接收事件的“门槛值”,此属性的默认值是 0,其意义是无论缓冲区中有多少字符都不引起接收事件。
如:MSComm1 Rthreshold20。
当接收缓冲区达到 20 个字符时,引发接收事件。
Sthreshold: 设定或传回引发传送事件的字符数。
如果在传输暂存缓冲区种的字符少于所设定的数值,则 CommEvent 属性会被设定为 CommEvSend,并产生OnComm 事件。
如:MSComm1 Sthreshold20。
当传送缓冲区字符少于 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 环境下的串口通讯程序设计变得方便易行。
最后希望本文能起到抛砖引玉的目的。
参考文献 1 范逸之.Visual Basic 与 RS232 串行通讯控制.北京:中国青年出版社