首页 WINIO库详细介绍

WINIO库详细介绍

举报
开通vip

WINIO库详细介绍WINIO库详细介绍 由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属于系统级的设备驱动程序。对并行口的读写操作就是如此,由于Windows对系统的保护,绝对不允许任何的直接I/O动作发生,所以必须带上*.dll、*.sys或*.vxd文件,这些文件用来让操作系统知道有一个特定的I/O可能会被调用。系统开机后,这些文件中的内容就会加载到内存中...

WINIO库详细介绍
WINIO库详细介绍 由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属于系统级的设备驱动程序。对并行口的读写操作就是如此,由于Windows对系统的保护,绝对不允许任何的直接I/O动作发生,所以必须带上*.dll、*.sys或*.vxd文件,这些文件用来让操作系统知道有一个特定的I/O可能会被调用。系统开机后,这些文件中的内容就会加载到内存中,一旦有对应的动作发生,就会引发I/O的实际动作。 本文只是介绍并行口作为数字I/O口的使用,不在于介绍并行I/O口驱动的编写。故本文中直接使用由 Yariv Kaplan 编写的 WinIo 库,它有如下特点:WinIo 库通过使用内核模式下设备驱动程序和 其它一些底层编程技巧绕过 Windows 安全保护机制,允许32位 Windows 程序直接对 I/O 口进行操作。 支持Windows 9x、Windows NT、Windows2000、WindowsXP环境;在Windows NT/2000/XP下,允许非 Administrator 用户应用 WinIo 应用程序;不支持中断。 注意事项:使用这个类代码时请确保不要与其它使用常规 Win32 调用操作并行端口的程序发生冲突。 WinIo库在VC应用程序中的使用(WinIo库下载) 为了在VC中能正常使用WinIo库,必须按以下步骤进行配置: (1):将WinIo.dll、WinIo.sys、WINIO.VXD三个文件放在程序可执行文件所在目录下; (2):将WinIo.lib添加到 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 中,WinIo.lib及winio.h文件必须放在工程目录下; (3):在StdAfx.h头文件中加入#include "winio.h"语句; (4):调用InitializeWinIo函数初始化WinIo驱动库; (5):调用读写IO口的GetPortVal或SetPortVal函数; (6):调用ShutdownWinIo函数; 在非管理员权限下运行,必须首先完成以下步骤: (1):将WinIo.dll、WinIo.sys、WINIO.VXD三个文件放在任一WinIo应用程序可执行文件所在目录下; (2):以管理员或其它具有管理员权限的用户身份登陆; (3):调用InstallWinIoDriver函数,第一个参数设置为WinIo.sys文件所在目录路径,第二个参数设置为false; (4):重新启动系统; (5):以普通用户身份登录,现在可以调用WinIo库函数; (6):当不再需要WinIo库时,可以再次以管理员身份或其它具有管理员权限的用户身份登陆系统,调用RemoveWinIoDriver卸载该库; WinIo库中几个函数说明: (1):初始化与终止 bool _stdcall InitializeWinIo(); void _stdcall ShutdownWinIo(); (2):安装与卸载 bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false); bool _stdcall RemoveWinIoDriver(); (3):读写I/O口 bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize); bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize); GetPortVal函数从指定端口读取一个BYTE/WORD/DWORD类型的值; wPortAddr是指定一个端口地址值; pdwPortVal为指向一双字节型变量的指针,该变量存储从wPortAddr端口读取的值; bSize指定读取字节数,值可以为1,2或4。 SetPortVal函数向指定端口写入一个BYTE/WORD/DWORD类型的值; 除dwPortVal为输入参数,表示待写入外,其余个变量含义与GetPortVal相似。 PC并行口数字输出的VC实现(示例工程下载) 为了测试并行口的数字输出,可以准备12支LED发光二极管,将LED的阳极分别与数据端口引脚Pin2,Pin9和控制端口引脚Pin1、Pin14、Pin16、Pin17相连接;将LED的阴极连接在一起与并行口的归地引脚GND相连即可。在实际控制应用中不能这样连接,因为数据端口引脚、控制端口引脚输出的电流非常小,只有10mA左右,必须添加 其它硬件电路。 (1):数据端口数字输出的VC实现 //获得数据端口地址 WORD m_nport=(WORD)0x378; //获得要写入数据端口的值WriteValue(数据范围为0,255) DWORD m_nValue=(DWORD)WriteValue; //调用WinIo库函数SetPortVal写端口值 SetPortVal(m_nport, m_nValue, 1);//write a BYTE value to an I/O port (2):控制端口数字输出的VC实现 //获得控制端口地址 WORD m_nport=(WORD)0x37A; //获得控制端口的值,保持高位值不变,将要输出的值从低4位输出,且使连接器上的电位状态与想输出的值一致 DWORD temp_dwPortVal; unsigned int temp_aa; GetPortVal(m_nport, &temp_dwPortVal, 1); //reads a BYTE value from an I/O port temp_aa=(unsigned int)temp_dwPortVal; temp_aa=temp_aa&0x0F0; //取低8位值,将低4位置为0;高4位不变; temp_aa=temp_aa^0x0B; //将低4位中C0、C1、C3置为1,C2置为0;高4位不变;//获得要写入控制端口的值WriteValue(数据范围为0,15) unsigned int WriValue; WriValue=WriteValue&0x0F; //取低4位; temp_aa=temp_aa^WriValue; //将写入值的低4位中的C0、C1、C3取反,C2位不变,高4位保持端口值不变 SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变, //低4位是写入什么电平,连接器上既是什么电平 (3):数据端口及控制端口组合成12位数字输出的VC实现 //获得端口地址 WORD m_nportData=(WORD)0x378; WORD m_nportControl=(WORD)0x37A; //获得要写入端口的值WriteValue(数据范围为0,4095) DWORD m_nValue=(DWORD)(WriteValue&0x0FF);//取低8位值 SetPortVal(m_nportData, m_nValue, 1);//write a BYTE value to Data port DWORD temp_dwPortVal; unsigned int temp_aa; GetPortVal(m_nportControl, &temp_dwPortVal, 1); //reads a BYTE value from an I/O port temp_aa=(unsigned int)temp_dwPortVal; temp_aa=temp_aa&0x0F0; //取低8位值,将低4位置为0;高4位不变; temp_aa=temp_aa^0x0B; //将低4位中C0、C1、C3置为1,C2置为0;高4位不变; unsigned int WriValue; WriValue=WriValue>>8;//取高4位值 temp_aa=temp_aa^WriValue; //将写入值的低4位中的C0、C1、C3取反,C2位不变,高4位保持端口值不变 SetPortVal(m_nportControl, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变, //低4位是写入什么电平,连接器上既是什么电平 PC并行口数字输入的VC实现 (1):状态端口数字输入的VC实现 为了测试并行口状态端口的数字输入,可以将数据端口引脚Pin2,Pin6连接到状态端口引脚Pin15、Pin13、Pin12、Pin10、Pin11上。引脚接好后,先从数据端口输出数据,在从状态端口和控制端口读出数据,读出的数据应与写入的数据一致,数据范围为0,31。 DWORD dwPortVal; unsigned int ValueGet=0; //获得端口地址 WORD m_nport=(WORD)0x379; //获得端口数据 GetPortVal(m_nport, &dwPortVal, 1); ValueGet=(unsigned int)dwPortVal; ValueGet=ValueGet^0x80; //保持得到的State值与连接器处的值一直; ValueGet=ValueGet&0xF8; //去掉S0 ,S2位; ValueGet=ValueGet>>3; //右移3位,将S7,S3变为低5位 (2):控制端口数字输入的VC实现 为了测试并行口控制端口的数字输入,可以将数据端口引脚Pin2,Pin5连接到控制端口引脚Pin1、Pin14、Pin16、Pin17上 。引脚接好后,先从数据端口输出数据,在从状态端口和控制端口读出数据,读出的数据应与写入的数据一致,数据范围为0,15。 //获得端口地址 WORD m_nport=(WORD)0x37A; //===== 将C0,C3位置1,即使连接器上为高电平 ,使控制端口为输入端口===== DWORD temp_dwPortVal; unsigned int temp_aa; GetPortVal(m_nport, &temp_dwPortVal, 1); //获取端口的当前值 temp_aa=(unsigned int)temp_dwPortVal; temp_aa=temp_aa&0x0F0; //取低8位值,将低4位置为0;高4位不变; temp_aa=temp_aa^0x4; //将低4位中C0、C1、C3置为0,C2置为1;高4位不变; SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高4位保持端口原来的值不变, //低4位是写高电平,即使连接器上是高电平 //============================================================= unsigned int ValueGet=0; DWORD dwPortVal; //获得端口数据 GetPortVal(m_nport, &dwPortVal, 1); ValueGet=(unsigned int)dwPortVal; ValueGet=ValueGet^0x0B; //保持C0,C1,C3位的值与连接器处的值一至; ValueGet=ValueGet&0x0F; //去掉高4位值 (3):控制端口及状态端口组合成9位数字输入的VC实现 为了测试并行口的数字输入,可以将数据端口引脚Pin2,Pin9连接到控制端口引脚Pin1、Pin14、Pin16、Pin17和状态端口引脚Pin15、Pin13、Pin12、Pin10上 ,Pin11引脚连接到归地引脚GND或悬空。引脚接好后,先从数据端口输出数据,在从状态端口和控制端口读出数据,读出的数据应与写入的数据一致,当Pin11引脚连接到归地引脚GND时,数据范围为0,255;当Pin11引脚悬空时,数据范围为256,511。 unsigned int ValueGet=0; //获得端口地址 WORD m_nportState=(WORD)0x379; WORD m_nportControl=(WORD)0x37A; //Read State Port DWORD dwPortVal; unsigned int ValueState=0; GetPortVal(m_nportState, &dwPortVal, 1); ValueState=dwPortVal; ValueState=ValueState^0x80; //保持得到的State值与连接器处的值一直; ValueState=ValueState&0xF8; //去掉S0 ,S2位; ValueState=ValueState<<1; //左移1位,将S7,S3变为高5位 //Read control Port //========== 将C0,C3位置1,即使连接器上是高电平 ,使控制端口为输入端口===== GetPortVal(m_nportControl, &dwPortVal, 1); //获取端口的当前值 ValueGet=(unsigned int)dwPortVal; ValueGet=ValueGet&0x0F0; //取低8位值,将低4位置为0;高4位不变; ValueGet=ValueGet^0x4; //将低4位中C0、C1、C3置为0,C2置为1;高4位不变; SetPortVal(m_nportControl, (DWORD)ValueGet, 1); //写出的值中,高4位保持端口原来的值不变, //低4位是写高电平,即使连接器上是高电平 //============================================================= unsigned int ValueControl=0; GetPortVal(m_nportControl, &dwPortVal, 1); ValueControl=(unsigned int)dwPortVal; ValueControl=ValueControl^0x0B; //保持C0,C1,C3位的值与连接器处的值一至; ValueControl=ValueControl&0x0F; //去掉高4位值 //get 9bit value ValueGet=ValueState^ValueControl;
本文档为【WINIO库详细介绍】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_682974
暂无简介~
格式:doc
大小:25KB
软件:Word
页数:8
分类:互联网
上传时间:2017-10-17
浏览量:174