前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

PowerBuilder中串行通信编程技术研究(2)_燕哈哈_新浪博客 加载中… 燕哈哈的博客 http://blog.sina.com.cn/31heart [订阅][手机订阅] 首页 博文目录 图片 关于我 个人资料 燕哈哈 Qing 微博 加好友 发纸条 写留言 加关注 博客等级: 博客积分:1723 博客访问:194,697 关注人气:82 天天美食 精彩图文 相关博文 更多>> 推荐博文 阿里进入手游是在防守反击 阑夕 郭去疾:全球化母鸡下的蛋 李志刚 简評上海季流量包:外行指导内行 付亮的竞争情报应用 “果壳明日之星”--黄冬首次披 老黄 上海自贸区开放电信业务&nbs hotashang IBM的启示:领导者在转型中的 沈拓2011 手机电商:传统手机厂商血染的风 老杳 2014年地方网站将面临的主要 梦里秦淮 无体验不营销 魏家东 12306抢票经历:还是Chr hotashang 查看更多>> 谁看过这篇博文 加载中… 正文 字体大小:大 中 小 PowerBuilder中串行通信编程技术研究(2) (2008-10-24 10:14:55)转载▼ 标签: 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下的声明为: FUNCTION ulong ReadFile(ulong hFile,ref Any lpBuffer,ulong nNumberOfBytesToRead,ref ulong lpNumberOfBytesRead,ref OVERLAPPED lpOverlapped) LIBRARY "kernel32.dll" 2.2.3 调用Win32 API函数实现串行通信主要步骤 在PB中将Win32 API函数申明为外部函数之后,就可以像调用PB自身的函数一样调用它们。在PB编程中调用Win32 API函数实现串行通信主要步骤如下:(1)打开串口 调用CreateFile()函数打开并初始化串口,以确定本应用程序对此串口的占有权并封锁其他应用程序对此串口的操作。成功打开串口后,函数返回标志该串口资源的句柄,以后对串口的读写操作都是通过该句柄实现的。(2)配置串口 Windows的串口和串行通信驱动程序是通过一个被称为设备控制块(DCB)的数据结构进行配置的,Windows为获取通信端口的状态提供了重要的 GetCommState()函数。使用GetCommState()函数获取串口的当前配置,即获得当前的设备控制块DCB结构,更改DCB结构中的参 数,再调用SetCommState()函数重新设置串口的波特率、数据位、检验位与停止位来配置串口。通过SetComm()函数设置串行通信端口的输 入和输出缓冲区的大小,通过SetCommTimeouts()函数设置串口读写操作的溢出时间。如果不对串行口资源进行设置,将使用系统的缺省配置。(3)对串口进行读写操作 当采用事件驱动I/O设备时,用SetCommMask()来监视指定通信资源上的事件,用WaitCommEvent()来等待通信事件发生。在此基础 上就可以在相应的串口上作数据的传输。通过ReadFile()函数或ReadFileEx()函数对串口进行读操作,通过WriteFile()或 WriteFileEx()函数对串口进行写操作。(4)关闭串口 串行通信结束时调用CloseHandle函数关闭由CreateFile函数打开的串口,释放串口资源。 2.3 利用通信组件实现串行通信编程 2.3.1 利用SPComm组件实现串行通信编程 串行口VCL组件SPComm封装有丰富的与串口通信密切相关的属性和事件,是目前功能比较完善的串行通信组件,提供有完整的源代码。(1)SPComm的主要属性 CommName:填写所要打开的串口名字,如“COM1”。 RaudRate:设定实际的串行通信波特率。 ParityCheek:奇偶校验。 ByteSize:设定字节长度。 Parity:奇偶校验位。 StopBits:停止位。 SendDataEmpty:布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False时表示发送缓存不为空,或者发送队列里有信息。(2)SPComm的主要方法和事件 StartComm()过程用于打开串口,当操作失败时通常会报错,错误主要有7种:串口已经打开;打开串口错误;文件句柄不是通讯句柄;不能安装通讯缓存;不能产生事件;不能产生读进程;不能产生写进程。 StopComm()过程用于关闭串口,没有返回值。 WriteCommData()函数把要发送的字符串写入发送缓冲区,发送成功返回True,发送失败返回False。执行此函数将立即得到返回值,发送 操作随后执行。此函数有两个参数:pDataToWrite是要发送的字符串;dwSixeofDataToWrite是发送数据帧的长度。 OnReceiveData(Tobject * Sender, Pointer Buffer, WORD BufferLength) 事件的功能是当输入缓存有数据时将触发该事件,可在该事件中对从串口收到的数据进行处理。参数Buffer是接收到的数据,BufferLength是接 收到的数据长度。 OnReceiveError(Tobject * Sender,DWORD EventMask)事件功能是当接收数据时出现错误将触发该事件,EventMask是错误事件的代码。 OnSendDataEmpty(Tobject * Sender)事件的功能是当发交通安全数据完成时将触发该事件。 SPComm组件的应用与MSComm控件相似,基本编程时只要给组件的相关属性正确赋值就可配置串行通信参数,通过组件的方法打开/关闭串口和发送数 据,在组件相应的通信事件处理函数中接收数据和处理通信事件。与MSComm ActiveX控件不同的是,SPComm组件是标准的VCL组件,提供多线程编程的支持,能够更可靠地进行串行数据通信。 2.3.2 利用其它第三方组件实现串行通信编程 某些公司根据实际的需要为Windows环境提供了不同的开发工具。如TurboPower公司出品的Async Professional VCL组件包,功能更具体和完善,完全支持COM端口控制和WinSock协议,支持与ISDN Modem和RS485等硬件接口交互等功能,程序员可以选用其VCL组件进行串行通信程序开发。 2.4 利用DLL实现串行通信编程 MOXA,Advantech,NI等公司在提供串行通信接口硬件板卡产品的同时,提供了相应的DLL(Dynamic Link Libraries动态链接库)文件,程序员可以根据实际情况选用对应的DLL文件进行串行通信程序的二次开发;另外,程序员也可先用VC或其他高级编程 语言将通信程序编写成DLL文件,然后在PB中调用此DLL中的函数实现串行通信。编程中应特别注意要对DLL文件中的函数进行声明。 3 串行通信编程实例 通过PC机的串行口与单片机系统进行通信,完成对单片机系统的控制和数据的接收处理。PC机通信程序采用PB8.0和MSComm通信控件编写。 在通信窗口中插入MSCOMM32.OCX通信控件,控件名为Ole_MSC,添加读数据按钮,名为cb_read。通信控件用于访问串口、发送和接收数据,数据传输采用二进制方式。(1)打开并配置串口 在通信窗口的Open()事件中编程,完成对串口的打开和配置,程序如下: Ole_MSC.object.CommPort=1 //设置通讯端口号为COM1 Ole_MSC.object.Settings = "4800,n,8,1" //波特率4800 bps,无奇偶校验,8位数据位,1位停止位。 Ole_MSC.object.InBufferSize =600 //设置接收缓冲区的字节数 Ole_MSC.object.OutBufferSize =600 //设置发送缓冲区的字节数 If Ole_MSC.object.PortOpen <> True Then Ole_MSC.object.PortOpen = True //打开串口 End If Ole_MSC.object.InputMode =1 //二进制方式读取数据 Ole_MSC.object.SThreshold = 0 //数据传输事件不产生 OnComm 事件 Ole_MSC.object.RThreshold = 400 //每400个字节的数据到缓冲区都触发OnComm 事件。(2)数据的发送 通过Output属性向传输缓冲区发送读数据命令“ReadData”。数据的传输采用二进制方式,PB中发送和接收二进制数据,采用blob类型的变量。cb_read的click()事件程序如下: blob bufferout Ole_MSC.object.OutBufferCount=0 //清空发送缓冲区 Ole_MSC.object.InBufferCount=0 //清空接收缓冲区 bufferout=blob("ReadData") Ole_MSC.object.Output =bufferout //向传输缓冲区发送读数据命令(3)数据的接收处理 当单片机接收到读数据的通信命令后,向缓冲区发送数据,进入通信状态。数据的传输采用定长的二进制方式,单片机向缓冲区发送400个字节长的数据,当 400个字节的数据到缓冲区则触发Ole_MSC的OnComm()事件。通信控件Ole_MSC的OnComm事件程序如下(数据处理程序略): blob buffer choose Case ole_1.object.CommEvent Case 2 // CommEvent 属性为ComEvReceive ole_1.object.InputLen =0 //读入整个缓冲区中的数据 buffer=ole_1.object.Input //从接收缓冲区读取全部数据 …… end choose(4)关闭串口 在串口使用完后应将其关闭,释放串口资源。 If Ole_ MSC.object.PortOpen <> False Then Ole_ MSC.object.PortOpen = False //关闭串口 End If 4 结束语 比较以上实现串行通信的方法可知,使用MSComm控件或SPComm组件编程比较简单,对硬件掌握的程度要求不高,容易掌握,开发周期短,更适合于快速 开发串口通信程序,MSComm控件通信的实时性不高,高速通信时准确性和处理速度一般,只能应用于相对比较简单的小型控制系统和通信系统,SPComm 组件支持多线程,通信的实时性和可靠性均可得到保证。调用Win32 API函数来实现串行通信,程序编写较为复杂,需要掌握大量通信知识,其优点是可实现的功能更强大,应用面更广泛,更适合于面向具体要求编写灵活多变的底 层通信程序,常应用于响应要求严格、数据量大的系统中。在不同的应用中要视串口通信任务的要求,采用不同的方法开发通信程序,才能取得较好的效果。文中所 给程序在PB8.0环境中运行通过。 分享: 喜欢 阅读┊ 评论 ┊ 收藏 ┊转载 ┊ 喜欢▼ ┊打印┊举报 已投稿到: 排行榜 圈子 加载中,请稍候...... 前一篇:PowerBuilder中串行通信编程技术研究(1) 后一篇:用PB编写多线程应用程序 评论 重要提示:警惕虚假中奖信息 | [发评论] 评论加载中,请稍候... 发评论 | 登录名: 密码: 找回密码 注册 记住登录状态昵 称: 分享到微博 评论并转载此博文验证码: 请点击后输入验证码 收听验证码 匿名评论 发评论 以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 < 前一篇PowerBuilder中串行通信编程技术研究(1) 后一篇 >用PB编写多线程应用程序 新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正 新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑 Copyright &copy; 1996 - 2014 SINA Corporation, All Rights Reserved 新浪公司 版权所有