API 实现串行通信的查询方法
Visual Basic是一个Windows系统下流行的应用程序开发平台。其方便的界面设计使程序员能节省大量时间,并把最大的精力集中在应用程序核心代码的编写上。VB4目前已成为Win95系统下一种最高效灵活的主流开发工具之一,而调用API应用程序接口则正是对VB4功能的强有力扩充,它使得VB4能够直接控制和处理PC硬件资源,而不必依赖于MS-DOS系统服务。可以说,正是借助于API使得VB即能隐藏大部分Windows编程的难点,同时又提供了使用Windows环境的灵活性。
因而在串行通信中使用调用API接口的方法是实现在VB中直接控制串行口硬件的简便可行的解决方案。
一、关于Win95的多线程及32位API的描述
微软于95年推出的Win95操作系统是对其旧版本Windows性能的一次全面提升。它率先提出并实现了应用程序多线程的编程思想,这是Win95系统区别于其他系统最显著和最重要的特征之一。进程是应用程序的执行实例,而线程则是进程内部执行的路径,从根本上说,线程是可由系统调度的一个最简单的代码单元,每个线程有自己的一组CPU寄存器和堆栈。Win95为每个独立的线程安排一些CPU时间,操作系统以轮转方式向线程提供时间片,这样每个线程从外观上看就象都在同时运行一样。一个多线程的应用程序实际上在其内部实现了多任务扩展,为代码赋予了并行执行的特性。
多线程应用程序的主要优势就是可以用尽量少的时间对用户的要求作出响应。多线程并不代表代码会运行得更快,准确地说,它仅仅意味着应用程序可以更好地利用系统资源(调度机制、内存和物理设备)。从而能建立一个非常灵活的应用程序,它能随时接收用户输入,并得到满意的效果。
因此为了在32位的Win95系统中建立更快速、可靠和健壮的代码,多线程技术是必须掌握的关键技术之一。
API(即应用编程接口)是附带在Win95内部的一个极其重要的组成部分。Win95的32位API主要是一系列很复杂的函数、消息的集合。它可以看作是Win95系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。它使编程人员可以更容易地用不同类型的语言编制出运行在Win95系统上的应用程序。
与Windows 3.x的16位API相比,附带在Win95中的Win32 API是API质量最显著的一次提升。它正逐渐成为应用广泛的一种目标平台。Win32 API包括了1000多个API调用,加上API附带的几百种Windows常量、消息和数据类型结构,使用户拥有了一系列用于Win95编程的复杂的而又有效的工具。
API接口是对VB功能的最重要的扩充。几乎所有用VB的标准功能不能处理的问题都可以用调用API接口函数的方法来解决。API接口调用不仅给VB提供了大量可扩充的功能强劲的函数。更为重要的是,它提供了一种最切实地扩充VB功能的思路和方法。尤其在一些直接和硬件交互的低级操作中,调用API接口函数往往是唯一的可行办法。
总之,调用API接口并结合多线程的编程技术已成了Win95环境下最流行的一种高级技术。大多数应用程序的代码都不得不涉及到这个高级专题。
二、Win95串行通信的工作机理
常用的DOS系统主要是工作在响应中断方式。PC机串行通信程序大多利用其BIOS块的INT14H中断,以查询串口的方式完成异步串行通信。
与DOS响应中断的工作方式不同,Windows是一个事件驱动的,并与设备无关的多用户操作系统。同时Windows禁止应用程序直接和硬件交互,程序员只能通过Windows提供的各类驱动程序来管理硬件。在这种情况下,Windows系统充当了应用程序与硬件之间的中介。
Windows系统函数即包含了通信支持中断功能。Win95系统为每个通信设备开辟了用户定义的输入输出缓冲区(即读/写缓冲区),数据进出通信口均由系统后台来完成。应用程序只需完成对输入输出缓冲区操作就可以了。实际过程是每接收一个字符就产生一个低级硬件中断,Win95系统中的串行驱动程序就取得了控制权,并将接收到的字符放入输入数据缓冲区。然后将控制权返还正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据。队列中的数据按“先进先出”的次序处理。
Windows 3.x提供了COMM.DRV驱动程序以支持串行通信,而Win95已对这些串行通信的标准函数作了改进和标准化,并把对串口的支持与基本输入输出驱动程序集成为一体。Win95像对文件操作一样来实现对串口的操作,两者使用相同的打开、关闭及读写函数。
以下是相应的串行通信函数在16位和32位API中的比较:
16位的API只提供了16个与通信相关的函数。与这些16位的通信函数相比,Win95提供的通信函数更为丰富,功能更为强大。
在Win95系统中,串行口和串行通信驱动程序是通过一个数据结构进行配置的,这个数据结构被称为设备控制块( Device Control Block ),简称DCB。Win95的DCB比Windows 3.x的DCB更复杂,对数据结构的定义更完善。
下面是Win95中设备控制块数据结构的定义:
Type DCB ’在Win95 API中有详细定义,可从VB4的API Text Viewer中得到
DCBlength As Long
BaudRate As Long
fBinary As Long
fParity As Long
……
EvtChar As Byte
End Type
Win95为获取通讯端口的状态提供了重要的GetCommState函数。函数把端口的配置信息装入一个设备控制块DCB,从而获得端口的配置情况。
另一个重要的COMSTAT结构则通常被用来描述串口当前的状态。其定义如下:
Type COMSTAT ’在Win95 API中有详细定义,可从VB4的API Text Viewer中得到
fCtsHold As Long
fDsrHold As Long
……
cbInQue As Long
cbOutQue As Long
End Type
通常可按以下四步实现串行通信:
(1) 按协议的设置初始化并打开串行口,这样做就是通知Windows本应用程序需要这个串口,
并封锁其他应用程序使它们不能使用此串口。
(2) 配置这个串行口。
(3) 在串口上往返地传输数据,并在传输过程中进行校验。
(4) 不需要此串口时,关闭串口。即释放串口以供其它应用程序使用。
在这四个步骤中,主要的程序代码集中在第(3)步。