- 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: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)