1、并行接口程序设计本章介绍在 Windows 2000/XP 下的并行接口的程序设计方法,分析一下目前进行并行接口编程的方法,可以归纳为几种: DLL 直接 I/O 方式:应用程序通过一个可以进行端口 I/O 访问的 DLL 接口软件实现对并行接口的访问,即通过调用第三方 DLL 接口软件中的 I/O 端口读写函数实现对并行口的寄存器的读写。这样的软件很多,像 WinIo、Inpout32、TVicPort 等; Active X 控件直接 I/O 方式:通过一个提供 Active X 控件实现对端口的直接 I/O访问,一般控件的方式采用 VB 编程比较简单。这样的软件包括Inpout32、TV
2、icPort 等; 并行接口专用接口软件:使用这一类软件对并行接口编程要比上 2 种方法简单,有些软件支持中断。这样的软件如 TVicLPT。 自己编写驱动程序:直接在 VC+环境下通过 Windows 2000 DDK 或 Windows XP DDK 编写驱动程序,这是一种最灵活的方法,但编程的难度比较大。5.1 实现直接 I/O 方式的软件并行接口的编程在不同的操作系统下采取不同的方法,在 DOS 和 Windows95 之前的操作系统下,可以直接对端口进行读写,根据并行接口的不同模式的寄存器进行读写操作就可以完成各种模式的接口编程。在目前的 Windows 2000/XP 操作系统下,
3、不能直接对端口寄存器进行访问,这是由于 Windows2000/XP 对系统底层操作采取了屏蔽的策略,对用户而言,系统变得更为安全,但这却给接口和接口软件开发人员带来了不小的困难,因为只要应用程序中涉及到底层的操作,开发人员就不得不深入到 Windows 的内核去编写属于系统级的设备驱动程序。对并行口的读写操作就是如此,由于 Windows 对系统的保护,应用程序不允许直接 I/O操作。在 Windows2000/XP 操作系统下,正规的接口程序的编程方法是采取驱动程序的开发方法。由于驱动程序需要与操作系统最底层进行交互,因此不同的操作系统的底层结构对应不同的设备驱动程序模型。Windows
4、2000/XP 与 Windows 9x 的内部结构不同,这两类操作系统的设备驱动程序是不兼容的,为了解决不同的操作系统的结构的差异带来的设备驱动程序的不兼容的问题,微软公司在 1997 年提出了 Windows 操作系统的驱动程序模型,即 WDM(Windows Driver Model)。WDM 设备驱动程序的开发是在 VC+下通过 DDK(Device Development Kit:设备驱动程序开发包)才能完成的,这种方法的编程是比较复杂的,需要了解操作系统的内部结构,并需要熟练的 VC+开发经验。如果不采用 WDM 的方法,一个简单实用的方法是使用间接的 I/O 方式,就是在应用程序
5、调用一个第三方提供的直接 I/O 接口程序,由这个间接的 I/O 程序模块实现对端口的读写。下面介绍几种这样的软件产品。106 计算机高级接口实践 5.1.1 Inpout32Inpout32:由 LOGIX4U 提供的免费软件,可以在 http:/ 提供了以 DLL 文件和 AxtiveX 的 OCX 文件两形式提供了直接访问 I/O 端口的函数,在文件中只封装了 2 个函数,Inp32( )和 Out32( )。支持从 Windows 95/98/Me 到Windows NT/2000/XP 的多种操作系统。Inpout32 只提供对 I/O 端口的访问,不针对具体的接口类型,原则上可以完
6、成所有面向寄存器访问编程的应用程序。但 Inpout32 没有提供中断的支持,所以只能完成以查询控制方式的程序,不能实现中断控制方式的程序设计。这可能会影响接口的传输速度,同时也使得软件的 CPU 占用率很高。很可贵的是,在下载的软件包中提供了 DLL 和 OCX 文件的 VC+源程序代码,这对于开发接口相关的 DLL 程序和 OCX 控件程序很有参考价值。5.1.2 TVicPortEnTech 提供了用于接口编程的多个软件产品,包括 TVicTW32、TVicLPT 和TVicPort 等,这些软件可以在 EnTech 的网站 http:/ TVicPort 是一个免费的软件,是 TVic
7、HW32 的简化版。TVicPort 是需要安装的,默认的目录是 C:TVicPortPersonal,在该目录下有 Docs 和Samples 两个目录,分别是说明文件和程序例子源文件。核心模块被安装到了系统目录。1. TVicPort 功能说明TVicPort 的功能包括:直接 I/O 访问;通过一个指针将物理存储器影射用户程序的存储空间;增强对并行接口的支持,可以直接控制和检测并行端口的信号线;提供获得 IDE 硬盘的制造商信息的函数,如硬盘序列号,可以实现软件的硬盘邦定;支持 Windows XP 64bit。TVicPort 提供的核心模块文件包括 TVicPort.sys、TVic
8、Port.vxd、TVicPort.dll 和TVicPort.ocx 四个。其中 TVicPort.vxd 是用于 Windows 9x/ME 的虚拟设备驱动程序,TVicPort.sys 是用于 Windows 2000/XP 的内核模式驱动程序,DLL 和 OCX 是应用程序接口模块,实现应用程序与设备驱动程序的连接。虽然 TVicPort 支持多种语言平台,但DLL 函数更适合用于 VC+编程,而 OCX 文件适合用于 VB 编程。TVicPort 提供两种对于端口的访问方式,即“Hard ”和“Soft ”方式,其中“Soft”方式的读写速度比较快,但当被读写的端口地址被另一个内核模
9、式驱动程序占用时会访问失效。而“Hard ”方式可以避免这种情况,即使端口被另一个内核模式驱动程序占用也能完成可靠的读写,但其访问速度比“Soft”方式慢。函数默认的访问方式是 “Hard”方式,可以使用 SetHardAccess( )函数更改访问方式。也可以通过函数 TestHardAccess( )函数返回当前的访问方式。2. TVicPort 的 DLL 函数下面介绍 TVicPort 的 DLL 文件提供的 VC+格式接口函数。这些函数的原形说明在第 5 章 并行接口程序设计 107TVicPort.h 中,在 VC+中加入 TVicPort.h 后可以直接按照下面介绍的格式实现调用
10、。如果在 VB 中调用这些函数,可以在 VB 工程中加入SamplesVBPortLib.bas 模块,在模块中对全部函数作了声明,可以参照模块中的声明细节实现在 VB 中的调用。(1) TVicPort.dll 提供的公共函数BOOL OpenTVicPort( ):打开(加载)TVicPort.vxd 或 TVicPort.sys 设备驱动。参数:无。返回:打开成功返回 TRUE,失败返回 FALSE。BOOL IsDriverOpened( ):测试驱动程序是否打开。参数:无。返回:驱动程序已打开返回 TRUE,未打开返回 FALSE。void CloseTVicPort( ):关闭(卸
11、载)设备驱动程序。void SetHardAccess(BOOL HardAccess ):设置当前的访问方式为“Hard”或“Soft”。参数:TRUE 表示设置为 “Hard”方式,FALSE 表示设置为“Soft”方式。返回:无。BOOL TestHardAccess( ):测试当前的访问方式。参数:无。返回:TRUE 表示“Hard”方式,FALSE 表示“Soft”方式。(2) TVicPort.dll 提供的端口访问函数UCHAR ReadPort (USHORT PortAddr):读端口 1 个字节。USHORT ReadPortW (USHORT PortAddr):读端口
12、2 个字节(字) 。ULONG ReadPortL(USHORT PortAddr):读端口 4 个字节(双字) 。参数:端口地址。返回:读得的端口数据。void WritePort (USHORT PortAddr, UCHAR bData):写 1 个字节到端口。void WritePortW (USHORT PortAddr, USHORT wData):写 2 个字(字)节到端口。void WritePortL(USHORT PortAddr, ULONG lData):写 4 个字节(双字)到端口。参数:PortAddr 为端口地址,bData / wData / lData 为要写
13、的数据。返回:无。void ReadPortFIFO (USHORT PortAddr, USHORT NumPorts, UCHAR * Buffer)void ReadPortWFIFO (USHORT PortAddr, USHORT NumPorts, USHORT * Buffer)void ReadPortLFIFO (USHORT PortAddr, USHORT NumPorts, ULONG * Buffer)功能:读取多个单元(字节 / 字 / 双字)到一个输入缓冲区。参数:PortAddr 为端口地址,NumPorts 为单元数,Buffer 为输入缓冲区指针。void
14、WritePortFIFO (USHORT PortAddr, USHORT NumPorts, UCHAR * Buffer)void WritePortWFIFO (USHORT PortAddr, USHORT NumPorts, USHORT * Buffer)void WritePortLFIFO (USHORT PortAddr, USHORT NumPorts, ULONG * Buffer)功能:写多个单元(字节 / 字 / 双字)到端口。参数:PortAddr 为端口地址,NumPorts 为单元数,Buffer 为输出缓冲区指针。(3) TVicPort.dll 提供的存储
15、器访问函数108 计算机高级接口实践 ULONG MapPhysToLinear (ULONG PhysAddr, ULONG MappedSize)功能:映射系统的物理存储器空间到应用程序的线性存储空间。参数:PhysAddr 为 32 位物理存储器起始地址,MappedSize 为映射的字节数。返回:物理存储器空间的首字节映射到线性存储空间的地址。void UnmapMemory(ULONG PhysAddr, ULONG MappedSize)功能:关闭由 MapPhysToLinear( )函数建立的映射。参数:PhysAddr 为 32 位物理存储器起始地址,MappedSize 为
16、映射的字节数。返回:无。UCHAR GetMem(ULONG MappedAddress, ULONG MemOffset )USHORT GetMemW(ULONG MappedAddress, ULONG MemOffset )ULONG GetMemL(ULONG MappedAddress, ULONG MemOffset )功能:读取线性存储空间的字节 / 字 / 双字数据,以上 3 个函数可以用于VB,因为在 VC+中可以直接通过指针实现线性地址空间的数据读取,而 VB 缺乏指针的操作手段。参数:MappedAddress 为由 MapPhysToLinear( )函数返回的线性存
17、储空间的首地址,MemOffset 为线性存储空间的偏移位置。返回:读取的数据。void SetMem(ULONG MappedAddress, ULONG MemOffset, UCHAR bValue )void SetMemW(ULONG MappedAddress, ULONG MemOffset, USHORT wValue )void SetMemL(ULONG MappedAddress, ULONG MemOffset, ULONG dwValue )功能:向线性存储空间写入一个字节 / 字 / 双字数据,以上 3 个函数可以用于VB,因为在 VC+中可以直接通过指针实现线性地
18、址空间的数据读取,而 VB 缺乏指针的操作手段。参数:MappedAddress 为由 MapPhysToLinear( )函数返回的线性存储空间的首地址,MemOffset 为线性存储空间的偏移位置,bValue / wValue / dwValue为要写入的数据。返回:无。(4) TVicPort.dll 提供的并行接口访问函数UCHAR GetLPTNumber():获得当前的并行接口号。参数:无返回:1 为 LPT1,2 为 LPT2。void SetLPTNumber(UCHAR LptNumber):设置一个并行口为当前并行口。参数:lptNumber 为 1 表示 LPT1,2
19、表示 LPT2。返回:无。UCHAR GetLPTNumPorts( ):检测系统中的 LPT 数目。参数:无。返回:系统中的 LPT 数目。ULONG GetLPTBasePort( ):获得当前 LPT 的基地址。参数:无。返回:当前 LPT 基地址。第 5 章 并行接口程序设计 109UCHAR AddNewLPT(USHORT PortBaseAddress):添加一个 LPT。参数:PortBaseAddress 为添加的 LPT 的基地址。返回:添加的 LPT 的号码,同时设置添加的 LPT 为当前 LPT。BOOL GetPin(UCHAR PinNumber):读取当前 LPT
20、 连接器的可读取线状态。参数:PinNumber 为 DB25 连接器的线编号,125。返回:TRUE 表示高电平,FALSE 表示低电平。void SetPin(UCHAR PinNumber, BOOL PinLevel):设置当前 LPT 的可写线状态。参数:PinNumber 为 DB25 连接器的线编号,PinLevel 为 TRUE 表示高电平,FALSE 表示低电平。返回:无。BOOL GetLPTAckwl( ):获得当前 LPT 的 Acknowledge 线状态。参数:无。返回:TRUE 表示有效,FALSE 为无效状态。BOOL GetLPTBusy( ): 获得当前 L
21、PT 的 Busy 线状态。参数:无。返回:TRUE 表示有效,FALSE 为无效状态。BOOL GetLPTPaperEnd( ):获得当前 LPT 的 PaperEnd 线状态。参数:无。返回:TRUE 表示有效,FALSE 为无效状态。BOOL GetLPTSlct( ):获得当前 LPT 的 Slct 线状态。参数:无。返回:TRUE 表示有效,FALSE 为无效状态。BOOL GetLPTError( ):获得当前 LPT 的 Error 线状态。参数:无。返回:TRUE 表示有效,FALSE 为无效状态。void LPTInit( ):在当前 LPT 的 Init 线(DB25 的
22、 16 号引脚)输出一个短暂的脉冲。参数:无。返回:无。void LPTSlctIn( ):设置当前 LPT 的 SelectIn 线为有效。参数:无。返回:无。void LPTStrobe( ):在当前 LPT 的 Strobe 线(DB25 的 1 号引脚)输出一个短暂的脉冲。参数:无。返回:无。void LPTAutofd(BOOL Flag):设置当前 LPT 的 AutoLF 线( DB25 的 14 号引脚)状态。参数:Flag 为 TRUE 表示有效,FLASE 表示无效。返回:无。(5) TVicPort.dll 提供的 IDE 硬盘访问函数110 计算机高级接口实践 void
23、 GetHDDInfo(UCHAR IdeNumber, UCHAR Master, HDDInfo * Info)功能:返回 IDE 硬盘的制造商参数。参数:IdeNumber 为 IDE 通道号,Masker 为 1 表示 Masker 设备,0 表示 Slave设备。*Info 为指向一个 HDDInfo 结构的指针,该函数填写 HDDInfo。返回:无。HDDInfo 结构如下:typedef struct _HDDInfo ULONG BufferSize; /缓冲存储器容量ULONG DoubleTransfer; /双字节数据传输支持ULONG ControllerType; /
24、控制器类型ULONG ECCMode; /ECC 校验模式ULONG SectorsPerInterrupt; /每中断的扇区数ULONG Cylinders; /柱面数ULONG Heads; /磁头数ULONG SectorsPerTrack; /每磁道扇区数char Model41; /型号char SerialNumber21; /序列号char Revision9; /控制器版本号 HDDInfo, *pHDDInfo;3. TVicPort 的 Active X 控件TVicPort 的 Active X 控件属性和 DLL 函数接口基本功能是类似的,个别 DLL 函数在Activ
25、e X 控件没有。Active X 控件的接口方式更适合在 VB 中使用。当然并不是在 VB 中必须使用 TVicPort 的 ActiveX 控件方式,也可以采用 DLL 方式调用 TVicPort.dll 中的函数。首先在 VB 中创建一个 Standard EXE 类型的工程,选择 Project 菜单中的 Components菜单项,打开 Components 窗口,在 Controls 选项卡中找到 TVicPort Active X Control Modele,选中后按确定按钮将 TVicPort 控件插入到 Toolbox 中,在将其拖到应用程序的窗体中,在窗体呈现一个 TVP
26、 标记,然后就可以编写代码了。TVicPort 的 Active X 属性成员名称和功能与 DLL 函数的有差别,全部的 Active X 属性成员以及和 DLL 函数的对应关系见下表。表 5-1 PVicPort 的 Active X 属性成员以及和 DLL 函数的对应关系Active X 属性成员 对应功能的 DLL 函数OpenDriver OpenTVicPortActiveHW IsDriverOpenedCloseDriver CloseTVicPortHardAccess SetHardAccess、TestHardAccess第 5 章 并行接口程序设计 111Port Rea
27、dPort、 WritePortPortW ReadPortW、WritePortWPortL ReadPortL、WritePortLMapPhysToLinear MapPhysToLinearUnmapMemory UnmapMemoryMem GetMem、SetMemMemW GetMemW、SetMemWMemL GetMemL、SetMemLLPTNumber GetLPTNumber、SetLPTNumberLPTNumPorts GetLPTNumPortsLPTBasePort GetLPTBasePortPin GetPin、SetPinLPTAckwl GetLPTAc
28、kwlLPTBusy GetLPTBusyLPTPaperEnd GetLPTPaperEndLPTSlct GetLPTSlctLPTError GetLPTErrorLPTInit LPTInitLPTSlctIn LPTSlctInLPTStrobe LPTStrobeLPTAutofd LPTAutofd5.1.3 TVicLPTTVicLPT 是 EnTech 提供的并行接口的专用接口软件,该软件包本身不是免费的,但公司网站上还提供了一个免费 TVicLPT 全功能评估版本。可以在 EnTech 的网站http:/ 上下载。TVicLPT 是需要安装的,TVicLPT 1.3 版默认
29、的安装目录是 C:TVicLPT13,在该目录下有 Help 目录和各种语言的测试程序源代码目录。核心模块 TVicLPT.ocx 和TVicLPT.sys 被安装到了系统目录。1. TVicLPT 功能说明TVicLPT1.3 版只提供 Active X 控件文件,没有提供 DLL 方式的函数调用接口。该控件支持多种语言调用,在安装的目录下可以找到 VB、MSVC、Borland C+Builder 和Borland Delphi 的测试程序代码。TVicLPT 的功能包括:检测标准的地址上的并行端口;具备添加非标准的并行口的能力;检测并行口支持的模式,包括 SPP、PS/2 、EPP 和
30、ECP 等;可以在不进行位操作的情况下实现并行口模式的转换;112 计算机高级接口实践 通过“名字”实现对并行口的直接访问;直接访问和操作 LPT 的连接器上的信号;实现硬件中断的挂接。2. TVicLPT 的 Active X 控件属性成员下面以 VB 语法格式说明 TVicLPT 的 Active X 控件的属性成员。(1) 公共的属性和方法object.Active = value 功能:打开/关闭设备驱动程序,或检测设备驱动程序打开状态。参数:Value 为设置参数,1 表示打开第一个驱动程序实例,2 表示打开第二个驱动程序实例,0 表示关闭驱动程序。返回:1 表示成功打开驱动程序,0
31、 表示为打开或打开失败。object.NumLPTs 功能:检测系统安装的标准的 LPT 数目。参数:无。返回:LPT 数目。object.AddCustomPort(CustomBaseAddress As Integer) 功能:添加非标准的(无法通过 NumLPTs 检测到的)LPT 到系统。参数:CustomBaseAddress 为添加的 LPT 的基地址。返回:无。object.Acquired = value 功能:锁定当前的 LPT 以防止被其他应用程序访问,或检测锁定状态。该属性成员只用于 Windows 9x/ME。参数:value 为设定值, 1 表示锁定,0 表示为锁定
32、或解除锁定。返回:可以是以下常数(在 lptCVT.bas 中定义)LPT_NOT_ACQUIRED:未锁定;LPT_ACQUIRE_SUCCESS:锁定成功;LPT_ACQUIRE_REFUSED:已经被另一个应用程序锁定;LPT_ACQUIRE_BAD_PORT:LPT 号错误或操作系统为 Windows 2000/XP;LPT_ACQUIRE_NOT_OPENED:设备驱动程序未打开。(2) 当前 LPT 和模式的属性和方法object.CurrentLPT = value 功能:设置或获得当前 LPT 号。参数:value 为设定值,表示 LPT 号。返回:当前 LPT 号。objec
33、t.CurrentLptMode = value 功能:设置或获得当前 LPT 的当前工作模式。参数:value 为设定值,表示模式, 可以是以下常数(在 lptCVT.bas 中定义)LPT_SPP_MODE:SPP 模式;LPT_PS2_MODE:PS/2 模式;第 5 章 并行接口程序设计 113LPT_EPP_MODE:EPP 模式;LPT_FAST_CENTRONIX:Centronix 模式;LPT_ECP_MODE:ECP 模式。返回:获得的当前 LPT 的工作模式,值的定义同上。object.MaxLptMode 功能:获得当前 LPT 支持的“最大”工作模式。参数:无。返回:
34、“最大”工作模式值。可以是以下常数(在 lptCVT.bas 中定义)LPT_NOT_PRESENT = 0LPT_SPP_MODE = 1LPT_PS2_MODE = 2LPT_EPP_MODE = 3LPT_FAST_CENTRONIX = 4LPT_ECP_MODE = 5object.EPPEnabled 功能:检测当前的 LPT 是否支持 EPP 模式。参数:无。返回:TRUE 表示支持 EPP,FALSE 表示不支持 EPP 模式。 (3) LPT 寄存器相关的属性和方法object.BasePortAddress 功能:返回当前 LPT 的基地址。参数:无。返回:当前 LPT 的
35、基地址值。object.ReadMode = value 功能:设置或返回当前 LPT 的数据寄存器的读写状态。参数:value 为设定值,0 表示“只写” ,1 表示“只读” 。SPP 不支持“只读” 。返回:TRUE 表示“只读”模式,FALSE 表示“只写”模式。object.DataPort = value object.StatusPort = value object.ControlPort = value object.EcrPort = value object.CfgaPort = value object.CfgbPort = value object.FifoPort =
36、 value object.EPPAddressPort = value object.EPPDataPort = value 功能:以上 9 个属性成员用于从当前 LPT 不同的寄存器读或向当前 LPT 不同的寄存器写数据。它们针对的寄存器分别为数据寄存器、状态寄存器、控制寄存器、ECR 寄存器、CFGA 寄存器、CFGB 寄存器、FIFO 寄存器、EPP地址寄存器和 EPP 数据寄存器。114 计算机高级接口实践 参数:value 为设定值,为写到当前 LPT 的相应寄存器的数据。返回:从当前 LPT 的相应寄存器读出的数据。(4) LPT 寄存器位相关的属性和方法object.DataP
37、ortBit( BitNumber As Integer ) = value object.StatusPortBit( BitNumber As Integer ) = value object.ControlPortBit( BitNumber As Integer ) = value object.EcrPortBit( BitNumber As Integer ) = value object.CfgaPortBit( BitNumber As Integer ) = value object.CfgbPortBit( BitNumber As Integer ) = value 功能
38、:以上 6 个属性用于设置或返回当前 LPT 的不同寄存器的指定位。6 个不同属性分别对应数据寄存器、状态寄存器、控制寄存器、ECR 寄存器、CFGA 和 CFGB 寄存器。参数:BitNumber 参数为位序号,07。value 为设定值,0 或 1。返回:获得的不同的寄存器的指定位的值,0 或 1。(5) LPT 连接器位相关的属性和方法object.Pin(PinNumber As Integer = value 功能:用于设置或返回当前 LPT 的 DB25 连接器上的指定线的信号状态。当前LPT 的读写状态(由 ReadMode 属性设定)将影响该属性成员的执行。参数:PinNumb
39、er 参数为连接器线序号,125。value 为设定值,0 或 1。返回:获得的线状态,TRUE 为高电平,FALSE 为低电平。object.PulseStrobe(ByVal DelayCycles As Long)功能:在当前 LPT 的 Strobe 线(DB25 的 1 号引脚)输出一个短暂的正脉冲。参数:DelayCycles 参数为一个和输出脉冲宽度相关的相对时间间隔,如为 0 表示尽可能的短。返回:无。object.PulseStrobeAndWaitBus(TimeOut As Integer) 功能:在当前 LPT 的 Strobe 线(DB25 的 1 号引脚)输出一个短
40、暂的正脉冲,但只有当外设送到接口的 BUSY 线信号变为有效状态才结束 Strobe 线的脉冲。参数:TimeOut 参数为一个相对的时间间隔表示等待 BUSY 信号的超时时间。返回:TRUE 表示成功,未超时;FALSE 表示超时。(6) 中断相关的属性和方法object.IrqNumber = value 功能:设置和获得当前 LPT 的中断号。参数:value 是一个设定值,指定中断号,取值范围为 115。通常 LPT1 使用中断 7,LPT2 使用中断 5。返回:当前使用的中断号。object.UnmaskIRQ 功能:解除当前 LPT 中断屏蔽,当硬件产生,将引发一个 LptInte
41、rrupt 事件。参数:无。第 5 章 并行接口程序设计 115返回:无。object.MaskIRQ 功能:屏蔽当前 LPT 中断。参数:无。返回:无。object.IrqCounter 功能:获得当前 LPT 发生的 中断数量。参数:无。返回:中断数。object _LptInterrupt(ByVal DataPort As Integer, ByVal StatusPort As Integer, _ByVal TimeStampLo As Long, ByVal TimeStampHi As Long)功能:当 LPT 的硬件产生中断时调用的函数。参数:DataPort 和 Stat
42、usPort 产生中断时的数据寄存器和状态寄存器,TimeStampLo 和 TimeStampHi 分别为时间邮票的低半部分和高半部分,参见 API 函数 QueryPerformanceCounter( )。(7) 批量读写相关的方法object.ReadEppByteArray(ByVal NumOfBytes As Long, ByRef ByteBuffer As Any) object.ReadEppWordArray(ByVal NumOfWords As Long, ByRef WordBuffer As Any)object.ReadEppLongArray(ByVal Nu
43、mOfDWords As Long, ByRef LongBuffer As Any)功能:这三个函数使用在 EPP 模式,分别用于读取字节、字和双字型数组。参数:NumOfBytes、NumOfWords 和 NumOfDWords 分别为三个函数读取的字节、字和双字数,ByteBuffer 、WordBuffer 和 LongBuffer 分别为三个函数的输入数据缓冲区。object.WriteEppByteArray(ByVal NumOfBytes As Long, ByRef ByteBuffer As Any)object.WriteEppWordArray(ByVal NumOf
44、Words As Long, ByRef WordBuffer As Any)object.WriteEppLongArray(ByVal NumOfDWords As Long, ByRef LongBuffer As Any)功能:这三个函数使用在 EPP 模式,分别用于向 LPT 写字节、字和双字型数组。参数:NumOfBytes、NumOfWords 和 NumOfDWords 分别为三个函数要写入的字节、字和双字数,ByteBuffer 、WordBuffer 和 LongBuffer 分别为三个函数的输出数据缓冲区。5.2 一个 PC 对等连接的并行接口测试实验进行并行接口实验的简
45、单方法是将两台 PC 通过一条并行接口电缆连接起来,可以通过软件测试并行接口的一些特性。本节介绍一个这样的并行接口实验。5.2.1 对等连接1. 工作模式在对等连接中,并行接口必须工作在可以双向传输的模式,在现有的 IEEE-1284 标准中,PS/2、EPP 和 ECP 支持字节双向传输。在这三种模式中, PS/2 和 ECP 模式比较适116 计算机高级接口实践 合对等连接。在 PS/2 模式中,握手信号可以自由的收程序的控制,本实验选择 PS/2 模式。2. 连接电缆由于并行接口最初的设计是针对打印机的,尽管在后续的升级中增加了多种模式,但有一点是没有改变的,就是并行接口的设计是用于连接
46、主机与外设的,如果使用并行接口连接两台主机,实现对等连接,可能要对接口信号线的功能作一些调整,设计一个合理的连接方案是遇到的第一个问题。在并行接口的信号线中,有 8 条双向数据线 D0D7,8 条地线,4 条控制输出线和 5条状态输入线。通过连接电缆将两端 PC 并行口的数据线和地线对应引脚连接,再将一端的 4 条控制输出线与另一端的 5 条状态输入线中的 4 条连接。下面的连接中可考虑到了ECP 模式的信号连接关系。表 5-2 并行接口的 ECP 模式 PC-PC 连接电缆A 端计算机接口线 B 端计算机接口线信号名 寄存器位 线号中间连接 线号 寄存器位 信号名nStrobe C0 1 1
47、0 S6 nAckD0 2 1k 2 D0D1 3 1k 3 D1D2 4 1k 4 D2D3 5 1k 5 D3D4 6 1k 6 D4D5 7 1k 7 D5D6 8 1k 8 D6数据线D7 9 1k 9 D7数据线nAck S6 10 1 C0 nStrobeBusy S7 11 14 C1 nAutoFdPError S5 12 16 C2 nInitnAutoFd C1 14 11 S7 BusySelect S4 13 17 C3 nSelectInnInit C2 16 12 S5 PErrornSelectIn C3 17 13 S4 SelectGround 1825 1825 Ground电缆的连接关系如下图。第 5 章 并行接口程序设计 1175.2.2 软件设计测试程序在 VB 下设计,并行接口的操作通过 TVicLPT 控件实现。1. 测试程序的功能测试程序是为了测试并行接口在 PS/2 模式的功能,主要实现以下功能: 可以完成对控制寄存器的位操所,通过对控制寄存器的位操作实现对接口信号线的状态控制;图 5-1 ECP 的 PC-PC 连接器关系11314251131425118 计算机高级接口实践 可以实时检测信号线的状态,这是通过读状态寄存