并行端口的配置知识.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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:00 0040:0000 F8 03 F8 02 E8 03 E8 02 BC 03 78 03 78 02 C0 9F 0040:0010 22 C8 20 80 02 85 00 20 00 00 2E 00 2E 00 64 20 0040: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.h int _outp(unsigned short port, int databyte); 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下硬件驱动程序编写的。 由于驱动程序可

文档评论(0)

cy65918457 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档