PowerBuilder中串行通信编程技术研究(1)
摘要:介绍了在PowerBuilder 中调用Win32 API函数、使用通信控件、利用VCL通信组件和调用DLL(动态链接库)中的函数来实现串行通信的方法,分析总结了各种方法的优缺点。
关键词:串行通信;事件驱动;应用程序接口;动态链接库
引言
在自动控制中,用PC机对工程实现实时监控,通常要求PC机能在用户界面上具有数据采集、数据处理以及控制信号的产生与传输等功能。在这种情况下,PC机 要与过程控制的信号相联系,就要求能实现对PC机的串行端口直接操作。串行通信具有传输距离长、连接简单、使用灵活方便、数据传输可靠性高等特点,在工业 监控、数据采集和实时控制系统中得到了广泛应用。
PowerBuilder(简称PB)是一种可视化的、面向对象的快速交互式应用开发工具。PB 以其简洁高效的集成开发环境、强大的数据窗口技术、便捷的报表生成及打印功能,越来越受到
广大开发人员的青睐。在各种开发软件中,PB对于数据库的上层编 程支持是名列前茅的,但是,PB对计算机的底层支持略显薄弱,没有提供串行通信的命令、函数或控件,与其它设备之间进行数据通信较为困难,笔者根据自己在write的返回值 PB编程中积累的经验,介绍了几种在PB中实现串行通信的方法。
1 串行数据通信
1.1 工作原理
Windows是一个事件驱动的与设备无关的多用户操作系统,它禁止应用程序直接和硬件交互,程序员只能通过Windows提供的各类驱动程序来管理硬 件。Windows系统函数包含了通信支持中断功能,Windows系统为每个通信设备开辟了用户定义的输入输出缓冲区(即读写缓冲区),数据进出通信口 均由系统后台来完成。应用程序只需完成对输入输出缓冲区操作就可以了。实际过程是每接收一个数据就产生一个低级硬件中断,Windows系统中的串行驱动 程序就取得了控制权,并将接收到的数据放入输入数据缓冲区,然后将控制权返还正在运行的应用程序。如果缓冲区数据已满,串行驱动程序用当前定义的流控制机 制通知发送方停止发送数据。队列中的数据按“先进先出”的次序处理。
1.2 通信方式
串行通信的数据是一位接一位顺序地传送下去,通信方式有以下几种:
(1)异步通信方式
异步通信方式中,数据是一帧一帧(包括一个字符或一字节数据)传送的,每一串行帧的数据由起始位、数据位、奇偶校验位和停止位组成。
(2)同步通信方式
同步通信方式中,数据开始传送前用同步字符来指示(常约定1-2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,就连续按顺序传送数据,直到通信告一段落。
(3)查询方式
查询方式是定时地查询串口的接收缓冲区,如果接收缓冲区有数据,就读取数据;若缓冲区中没有数据,继续执行,因此会占用大量的CPU时间,它实际上是同步方式的一种派
生。
(4)事件驱动方式
事件驱动方式通过设置事件通知,当所希望的事件发生时,Windows发出通知,这与DOS环境下的中断方式很相似。
采用异步方式可以提高系统的整体性能,在对系统强壮性要求较高的场合,建议采用这种方式。查询方式是一种最直接的读串口方式,但定时查询存在一个致命的弱 点,即查询是定时发生的,可能发生得过早或过晚。在数据变化较快的情况下,特别是主控计算机的串口通过扩展板扩展到多个时,需定时地对所有串口轮流查询, 此时容易发生数据的丢失。虽然定时间隔越小,数据的实时性越高,但系统的资源也被占去越多。事件驱动方式是一种高效的串口读方式,这种方式的实时性较高, 特别是对于扩展了多个串口的情况,只有当设定的事件发生时,应用程序得到消息后,才进行相应的处理,避免了数据丢失。事件驱动方式能够更好地处理串行端口 通信交互,其优点是程序响应及时,可靠性高。在实时性要求较高的场合建议采用事件驱动方式。
1.3 实现步骤
利用PC机的串口实现串行通信的一般步骤如下:
(1) 打开并配置串口
在应用程序中要使用串口进行通信,必须在使用前向操作系统提出资源申请,要求打开串口,为了保证串口通信数据传输的可靠性,串口打开时一般都设置为非共享模式,串口一旦被打开,其他的应用程序将无法打开或使用它。
在使用串口进行数据通信前必须对其进行配置,串口配置主要包括波特率、数据位数、停止位数、奇偶校验、发送缓冲区大小、接收缓冲区大小等。
(2) 数据读写和超时设置
串口打开并配置好后即可对其进行读写操作了,对串口的读写操作可采用查询、同步、异步和事件驱动等方式。
在串口通信时如果数据传输突然中断,对串口的读写操作可能会进入无限期的等待状态,为避免这种情况发生,必须设置串口读写操作的等待时间,等待时间超过后,串口的读写操作将被主动放弃,这样即使数据传输突然中断,程序也不会被挂起或阻塞。
(3) 关闭串口
在串口使用完后应将其关闭,否则如果没有关闭串口,该串口将始终处于打开状态,其他的应用程序就无法打开或使用它。
2 PowerBuilder编程中实现串行通信的方法
利用PowerBuilder实现串行通信常用的方法主要有四种:一是使用通信控件,如MSComm控件;二是调用Win32 API函数;三是利用串行通信组件;四是调用DLL(动态连接库)实现串行通信编程,下面就四种方法分别加以讨论。
2.1 使用MSComm通信控件实现串行通信编程
2.1.1 MSComm 控件
在PowerBuilder中可采用控件实现串行通信编程。串行通信控件(简称MSComm)是 Microsoft公司提供的Windows下串行通信编程的32位ActiveX控件。该控件将串行通信的大部分操作都封装到控件的内部,提供了一系列 通信
命令的接口属性和事件,它允许建立串行口连接,可以连接到其他通信设备(如Modem)、还可以发送命令、进行数据交换以及监视和响应在通信过程中可 能发生的各种错误和事件,从而可以用它创建全双工的事件驱动的通信程序。
MSComm控件提供两种处理通信的方式:事件驱动方式和查询方式。查询方式通过检查CommEvent属性值来确定通讯事件和错误。事件驱动方式在串口 接收到或发送完指定数量的数据时或状态发生改变时,MSComm通信控件捕获到这些事件和错误,触发OnComm事件,通过检查MSComm控件的 CommEvent属性的值来获得所发生的事件和错误代码值,从而执行相应的处理。
2.1.2 MSComm 控件主要属性和事件
CommPort:设置并返回通信端口号,选COM1时值为1。
Setting:以字符串的形式设置并返回串口通信参数,格式为“波特率、奇偶校验、数据位、停止位”。
PortOpen:设置并返回通信端口的状态,属性为True打开串口,为False关闭串口并清除
接收和传输缓冲区。
InputMode:设置从缓冲区读取数据的格式,0文本形式,1二进制形式;
Input:从接收缓冲区读取数据;
Output:向发送缓冲区写入数据;
InBufferCount:设置接收缓冲区中的字节数;
OutBufferCount:设置发送缓冲区中的字节数;
InputLen :设置并返回Input属性从接收缓冲区读取的字节数;
Rthreshold :当CommEvent 属性为ComEvReceive并产生OnComm之前设置并返回要接收的字符数
CommEvent:返回最近的通信事件或错误;
OnComm事件:无论何时当 CommEvent 属性的值变化时,就产生 OnComm 事件,标志
发生了一个通信事件或一个错误 。
PowerBuilder中串行通信编程技术研究(2)
标签: it powerbuilder 串口通信 pb 分类: POWERBUILDER
2.2 调用Win32 API函数实现串行通信编程
Windows操作系统对系统底层操作采取了屏蔽的策略,禁止应用程序直接访问计算机I/O端口,而由设备驱动程序统一管理,Windows封装了 Windows的通信机制,这种方式称为通信应用程序接口API(Application Programming Interfaces)。Windows 9x/NT/2000提供的API一般都支持32位的操作,又称为Win32 API,程序员可以利用Win32 API的通信函数进行编程,不用对硬件直接进行操作,使得应用程序的编制更加方便。
2.2.1 Win32 API常用通信函数
在进行串口通信时,经常需要用到下列一些API函数:
CreateFile():用于打开一个文件访问串口;
GetCommState():获取串口的当前配置,放入设备控制块DCB中;
SetCommState():根据DCB重新配置串口参数;
SetCommTimeouts():设置串口读写操作的溢出时间;
ReadFile():从串口的输入缓冲区读取数据;
WriteFile():向串口的输出缓冲区写入数据;
SetCommMask():监视指定通信资源上的事件;
WaitCommEvent():等待通信事件发生;
CloseHandle():关闭由CreateFile函数打开的串口。
以上这些函数的原形可在参考文献[1]中到。
2.2.2 API函数在PowerBuilder中的声明
PB支持对Win32 API函数的调用,在PB中使用Win32 API函数时,首先要将它们声明为外部全局函数,然后在脚本中调用。在PB中声明外部函数的语法为:
{Access} FUNCTION ReturnDataType FunctionName( {REF} {DataType1 Arg1,…,DataTypeN ArgN}) LIBRARY LibraryName
其中各参数的含义是:
Access:访问级别,可以是Public、Private、Protected,缺省为Public;
ReturnDataType:返回函数类型;
FunctionName:函数名,存储在DLL中的函数名。
DataType:参数的数据类型;
Arg:参数名;
LibraryName:动态连接库名。
在PB中声明时数据类型必须换成PB中相应的数据类型,而在声明或者调用到的结构类型(如DCB结构)和一些常量也应在PB中创建或声明。ReadFile()函数在PB下的声明为:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论