- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并行端口的配置
引子+++++这几天把以前关于并口访问的程序整理了一下,写了一点东西,希望提出好的意见。+++++正文开始++++++*前言*本文主要是讨论不同平台下对并行端口进行编程的方法。因条件所限,目前只局限于Intel386体系下的PC微机结构。第一章 *简介*并口在步进电机控制、数据采集等方面有广泛应用。本文就是讨论不同平台下,对并行端口的访问。到目前为止,在DOS、Windows 95/98、Windows NT/2000/XP和Linux下实现了并口访问程序。PC机上一般都至少有一个25针的并口,我们可以很容易在机箱后面找到它。当中,第18~25针是地线,第2~9针是数据输出线,剩下的是状态线和输入线。第二章 *实现*在PC机上,并行端口有相应的寄存器(Registers),这些寄存器会被映射到系统地址空间当中去。根据当初IBM设计PC时的方法,PC上的并口基址在系统地址一般是0x378和0x278(如果有第二个并口的话)。端口映射地址都存放在PC机的BIOS中。根据BIOS的设计,从低端40[0]H处开始,共有256(100H)Byte的空间,用来存放PC机外部设备的地址。所以我们也可以通过工具debug来查看这些内容,在命令行下:C:/debug进入debug环境,用d指令查看0x40[0]处的内容:-d 40:000040:0000 F8 03 F8 02 E8 03 E8 02 BC 03 78 03 78 02 C0 9F0040:0010 22 C8 20 80 02 85 00 20 00 00 2E 00 2E 00 64 200040:0020 20 39 34 4B 30 52 3A 27 30 52 30 52 0D E0 00 00... ...上面以16-bit(2Byte)为单位存放设备地址。偏移量0x00~0x07的,是4个串口地址(对应着COM1~COM4)。接下来的0x08~0x0F偏移量中,是4个并口地址(对应着LPT1~LPT4)。在Intel的X86体系上,内存的存放是Little-Endian顺序,也即小字节反而放在前面。这样,我们可以从上面的内存内容看出,LPT1的地址是0x3BC,LPT2地址是0x378。2.1 DOS、Win95/98下并口的访问在DOS、Win95/98下访问并口,相对而言较简单,只需要调用下面两个函数:#include conio.hint _outp(unsigned short port, intdatabyte);int _inp(unsigned short port);其中_outp是输出,_inp是输入。比如我要对8个输出数据线都写高电平(即0xFF),则可以用:/* 让8个输出数据线均为高电平1 */_outp(0xFF,0x378);?要让第1、2、3数据线为高电平,则可用:_outp(0x07,0x378);其余类推。2.2 Win NT/2000/XP下并口的访问由于Windows NT/2000内核与Windows 98/95的不同,所以访问并口的方法也要作相应的调整。也就是说,前面所讲的方法在NT内核下,已经不再实用啦!大家可以在NT下调用前面的_outp和_inp试试看,会发现,在执行这两个函数时,程序出现“执行非法程序”的错误框,然后程序就结束了。这是因为在Windows NT/2000下,从安全性出发,程序会被系统授予一定的特权(Privilege)和限制(Restriction)。通常,这种特权级会分作两个:用户模式(User Mode)和核心模式(Kernel Mode)。用户模式下的运行的程序等级是Ring 3。在核心模式下运行的程序等级是Ring 0。而在Ring 3下系统是不允许直接访问端口的。所以前面所用调用库函数_outp等的方法在Windows NT/2000下是行不通的。既然了解了上面的原因,我们就明白了:要在Windows NT/2000下实现对硬件端口的访问,就要通过一定的途径获得Ring 0下的权限。这个工作可以通过Windows的DDK(Device Drive Kits)来实现。Windows下的DDK也是一系列的API函数,只是这些函数是专门用于Windows下硬件驱动程序编写的。由于驱动程序可以运行在Ring 0的权限下面,所以也就解决了用户程序不能进入Kernel模式下的矛盾。另一个要解决的问题是驱动程序和用户程序之间要定义一个通信接口。这样,用户程序通过自己定义的驱动程序接口来实现对并口的访问。我们运用的方法是先利用DDK编写一个可访问并口的驱动程序(一般是XXXX.sys模样的文件),之后,由一个DLL文件指定外露接口。?幸运的是,已经有人在这方面为我们做好了相应的可访问并口的驱动程序,而且提
文档评论(0)