WINDOWS95与NT下微机与智能化仪的串行通信设计
随着计算机软硬件的是......
随着计算机软硬件的是益发展,基于Windows95及NT平台的软件越来越多,在智能化电子仪表及计算机控制系统中都涉及到计算机与智能仪或
计算机之间进行信息交换,而串行通信是计算机之间以及计算机与单片机等数字化仪器通信的一种重要手段,是实现工业监控的一种主要方式
,由于它高效可靠,价格便宜,遵循统一的标准,因而得到广泛应用。随着计算机技术不断发展,编程手段也不断提高,如Visual Basic 、
Delphi 、Visual C++ 以及 C++ Builder等采用面向对象构件的方法,使得编写Windows下的应用程序变得迅速和容易 ,其中Delphi功能强大,
代码效率高,深受软件开发人员睛睐, 但Delphi同Visual C++ 以及 C++ Builder一样均未提供通信构件,为此用Delphi开发通信应用软件时就
得应用API函数或Visual Basic的通信构件,API函数对一般开发人员有一定难度而且不太方便 ,而用VB 的通信构件开发的应用程序需在
WINDOWS95或NT中安装并注删相应的动态库才能运行,这对应用用户来说很不方便。为此本文介绍用API函数和多线程编程技术在Delphi3.0下设
计出自已的通信构件,并提供了全部源程序,利用Delphi安装新构件方法将其安装到自已的编译系统中,就可以十分方便地开发出通信程序,
该构件在智能超声液体成份分析仪及集散式网络测控热处理系统的被成功地应用。从中可以看出利用Delphi编制构件不断丰富Delphi的内容的
本文有[www.0574-laser.com]提供,请及时关注[www.0574-laser.com]提供的内容
方法。
1 串行通信构件设计思想
一般基于DOS编程的程序员在编写串行通信时,往往是编写一个中断服务程序,一旦串行口有数据它就会向CPU发出中断请求,CPU在响应该
中断后会执行串口的中断服务程序,从而完成预定的任务。在Windows操作系统下,由于Windows禁止应用程序直接和硬件打交道,所以程序员
只能使用Windows提供的标准函数编程。虽然由于无需对硬件编程对有关硬件调试方便,但Windows本身远比DOS复杂,所以对这些标准函数和
它们携带参数的理解和使用也远比DOS困难,在Windows3.X中,当一个通信设备被打开并允许传送WM-COMMNOTIFY消息时,只要该通信设备收到
数据,操作系统就会在消息队列中置入WM-COMMNOTIFY消息,应用程序可以通过截获操作系统发出的WM-COMMNOTIFY消息来对已打开的通信设备
进行操作。
在Windows95与NT中,修改了Windows3.X对串行口操作的标准函数,进行了更统一的规范化,取消了WM-COMMNOTIFY消息以及OpenComm,
CloseComm,ReadComm,WriteComm,FlushComm等函数,对待串行口操作如同文件一样,其串行设备的打开和关闭操作使用与文件打开与关闭
操作相同的函数,如CreatFile,CloseFile,ReadFile,WriteFile,PurgeComm等,由于Windows95与NT中允许用户定义大小的读写缓冲区,这
样数据丢失可能性很小,同时使得读写速度很快。在Windows95与NT中支持多线程编程技术,而Delphi3.0为多线程编程和编制构件提供了支持
,这样就可以编制串行通信构件了,即建立新的“.pak”文件就行了。
考虑到篇幅,在这个构件中只提供必要且够一般常用的几个属性和当输入缓冲有数据时而产生的事件,这些属性中可视属性为波特率、数
据位、效验位、停止位、串行口名、输入缓冲大小(即读缓冲)、输出缓冲大小(即写缓冲)、触发事件方式;运行属性有串口设备句柄、消
本文有[www.0574-laser.com]提供,请及时关注[www.0574-laser.com]提供的内容
息窗句柄、事件句柄;运行中的方法有端口打开和端口关闭函数。
构件的设计思想是:可视属性中的数据位、效验位、停止位、触发事件方式用梅举类型定义,编程人员将方便地选择所需的值就行了,可
视属性中波特率、串行口名、输入缓冲大小、输出缓冲大小由编程人员输入设定;触发事件方式有每收一字符触发和一队列收到后触发。在构
件的创建过程中将可视属性赋缺省值,当程序运行构件的端口打开函数(ComPortOpen )时,将串口按构件可视属性设定值进行端口初始化及
创建监视串口线程并返回端口句柄(hCommFile);监视线程的作用是,按触发事件方式监视串口,当串口有数据时就向窗函数发出自定义的
WM_COMMNOTIFY消息,窗函数收到WM_COMMNOTIFY消息后触发OnComm事件;当执行端口关闭函数(comPortClose)时,该函数关闭端口并撤消监
视线程。程序流程图为图1。
图 1
2 应用说明
当执行ComPortOpen函数(即方法)时,用CreatFile()打开串行口,此时fdwShareMode,参数必须是零,打开独占访问的资源。FdwCreate
参数必须是指定的OPEN_EXISTING标志,hTemplateFile参数必须是Nil,用GetCommState设置通信参数,用CreateEvent()创建事件对象,用
AllocateHWnd()得到窗口数构柄;利用Delphi3.0创建多线工具建立一个监视线程的对象TmyCommWacth;在监视线程中用ResetEVent()设置事
件句柄,用WaitForSingleObject()指定对象处于信号或超时状态时返回,用PostMessage()向指定窗发送消息; 窗函数收到消息后用
ClearCommError()清除错误,用自定的过程 OnCommData(PChar(msg.LParam), msg.WParam )触发事件OnComm,当执行端口关闭函数
comPortClose时 ,用CloseMyComThread撤消监视线程,用DeallocateHWnd()释放消息窗句柄,用 CloseHandle()关闭事件和串口;用
RegisterComponents 对构件进行注册。考虑到篇幅源程序未提供读写缓冲数据程序,实际上接收数据可在OnComm事件中用ReadFile()读,其
文件句柄为ComPortOpen返回的串口设备句柄hCommFile;写数据可编一过程或函数用WriteFile(),其文件句柄同读句柄,读写数据比较简单