第5章 并行接口程序设计
本章介绍在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、TVicPort等;
• 并行接口专用接口软件:使用这一类软件对并行接口编程要比上2种方法简单,有些软件支持中断。这样的软件如TVicLPT。
• 自己编写驱动程序:直接在VC++环境下通过Windows 2000 DDK或Windows XP DDK编写驱动程序,这是一种最灵活的方法,但编程的难度比较大。
5.1 实现直接I/O方式的软件
并行接口的编程在不同的操作系统下采取不同的方法,在DOS和Windows95之前的操作系统下,可以直接对端口进行读写,根据并行接口的不同模式的寄存器进行读写操作就可以完成各种模式的接口编程。
在目前的Windows 2000/XP操作系统下,不能直接对端口寄存器进行访问,这是由于Windows2000/XP对系统底层操作采取了屏蔽的策略,对用户而言,系统变得更为安全,但这却给接口和接口软件开发人员带来了不小的困难,因为只要应用程序中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属于系统级的设备驱动程序。对并行口的读写操作就是如此,由于Windows对系统的保护,应用程序不允许直接I/O操作。
在Windows2000/XP操作系统下,正规的接口程序的编程方法是采取驱动程序的开发方法。由于驱动程序需要与操作系统最底层进行交互,因此不同的操作系统的底层结构对应不同的设备驱动程序模型。Windows 2000/XP与Windows 9x的内部结构不同,这两类操作系统的设备驱动程序是不兼容的,为了解决不同的操作系统的结构的差异带来的设备驱动程序的不兼容的问题,微软公司在1997年提出了Windows操作系统的驱动程序模型,即WDM(Windows Driver Model)。
WDM设备驱动程序的开发是在VC++下通过DDK(Device Development Kit:设备驱动程序开发包)才能完成的,这种方法的编程是比较复杂的,需要了解操作系统的内部结构,并需要熟练的VC++开发经验。如果不采用WDM的方法,一个简单实用的方法是使用间接的I/O方式,就是在应用程序调用一个第三方提供的直接I/O接口程序,由这个间接的I/O程序模块实现对端口的读写。下面介绍几种这样的软件产品。
5.1.1 Inpout32
Inpout32:由LOGIX4U提供的免费软件,可以在www.logix4u/网站下载。
Inpout32提供了以DLL文件和AxtiveX的OCX文件两形式提供了直接访问I/O端口的函数,在文件中只封装了2个函数,Inp32( )和Out32( )。支持从Windows 95/98/Me到Windows NT/2000/XP的多种操作系统。
Inpout32只提供对I/O端口的访问,不针对具体的接口类型,原则上可以完成所有面向寄存器访问编程的应用程序。但Inpout32没有提供中断的支持,所以只能完成以查询控制方式的程序,不能实现中断控制方式的程序设计。这可能会影响接口的传输速度,同时也使得软件的CPU占用率很高。
很可贵的是,在下载的软件包中提供了DLL和OCX文件的VC++源程序代码,这对于开发接口相关的DLL程序和OCX控件程序很有参考价值。
盗墓系列电影5.1.2 TVicPort
EnTech提供了用于接口编程的多个软件产品,包括TVicTW32、TVicLPT和TVicPort等,这些软件可以在EnTech的网站htaiwan/dev/index.shtm上获得,其中TVicPort是一个免费的软件,是TVicHW32的简化版。
TVicPort是需要安装的,默认的目录是C:\TVicPortPersonal,在该目录下有Docs和Samples两个目录,分别是说明文件和程序例子源文件。核心模块被安装到了系统目录。
1. TVicPort功能说明
TVicPort的功能包括:
• 直接I/O访问;
• 上海高考时间2020通过一个指针将物理存储器影射用户程序的存储空间;
• 增强对并行接口的支持,可以直接控制和检测并行端口的信号线;
• 提供获得IDE硬盘的制造商信息的函数,如硬盘序列号,可以实现软件的硬盘邦定;
• 支持Windows XP 64bit。
TVicPort提供的核心模块文件包括TVicPort.sys、TVicPort.vxd、TVicPort.dll和四个。其中TVicPort.vxd是用于Windows 9x/ME的虚拟设备驱动程序,TVicPort.sys是用于Windows 2000/XP的内核模式驱动程序,DLL和OCX是应用程序接口模块,实现应用程序与设备驱动程序的连接。虽然TVicPort支持多种语言平台,但DLL函数更适合用于VC++编程,而OCX文件适合用于VB编程。
TVicPort提供两种对于端口的访问方式,即“Hard”和“Soft”方式,其中“Soft”方式的读写速度比较快,但当被读写的端口地址被另一个内核模式驱动程序占用时会访问失效。而“Hard”方式可以避免这种情况,即使端口被另一个内核模式驱动程序占用也能完成可靠的读写,但其访问速度比“Soft”方式慢。函数默认的访问方式是“Hard”方式,可以使用SetHardAccess( )函数更改访问方式。也可以通过函数TestHardAccess( )函数返回当前的访问方式。
2. TVicPort的DLL函数
下面介绍TVicPort的DLL文件提供的VC++格式接口函数。这些函数的原形说明在TVicPort.h中,在VC++中加入TVicPort.h后可以直接按照下面介绍的格式实现调用。
如果在VB火炬之光加点中调用这些函数,可以在VB工程中加入\Samples\VB\PortLib.bas模块,在模块中对全部函数作了声明,可以参照模块中的声明细节实现在VB中的调用。
(1) TVicPort.dll提供的公共函数
BOOL OpenTVicPort( ):打开(加载)TVicPort.vxd或TVicPort.sys设备驱动。
参数:无。
时而时而时而怎么造句 返回:打开成功返回TRUE,失败返回FALSE。
BOOL IsDriverOpened( ):测试驱动程序是否打开。
参数:无。
返回:驱动程序已打开返回TRUE,未打开返回FALSE。
friendship作文void CloseTVicPort( ):关闭(卸载)设备驱动程序。
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):读端口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为要写的数据。
返回:无。
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 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提供的存储器访问函数
ULONG MapPhysToLinear (ULONG PhysAddr, ULONG MappedSize)
功能:映射系统的物理存储器空间到应用程序的线性存储空间。
参数:PhysAddr为32位物理存储器起始地址,MappedSize为映射的字节数。
返回:物理存储器空间的首字节映射到线性存储空间的地址。
void UnmapMemory(ULONG PhysAddr, ULONG MappedSize)
功能:关闭由MapPhysToLinear( )函数建立的映射。
参数:PhysAddr为32位物理存储器起始地址,MappedSize为映射的字节数。
返回:无。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论