利用WinIo实现并口数据通信

更新时间:2023-05-21 15:06:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

利用WinIo实现并口数据通信

 2009年第8期

文章编号:100622475(2009)0820049205

计算机与现代化

JISUANJIYUXIANDAIHUA

总第168期

利用WinIo实现并口数据通信

袁 军,谭永东,任 俊

1

1

2

(1.西南交通大学电气工程学院,四川成都610031;2.西藏军区77516部队气象室,西藏拉萨850000)

摘要:在Windows2000/XP/NT下,由于系统安全性的考虑,I/OPC机与外部设备之间的数据通信,本文给出了一种利用WI口数据通信的方法。,最终给出了在应用程序中利用WinIo关键词:;inI/XP/NT

中图分类号:   doi:10.3969/j.issn.100622475.2009.08.014

ImplementationofDataCommunicationUsingParallelPortswithWinIo

YUANJun,TANYong2dong,RENJun

1

1

2

(1.SchoolofElectricalEngineering,SouthwestJiaotongUniversity,Chengdu610031,China;

2.MeteorologicalOffice,77516ArmyinTibetMilitaryArea,Lasa850000,China)

Abstract:Becauseofsecurity,theI/Oportscan’tbeaccesseddirectlyinWindows2000/XP/NT.TorealizethecommunicationbetweenPCandperipheralequipmentsbyparallelports,thispaperproposesanapproachwhichcircumventsWindowsprotectionmechanismsusingvirtualXdeviceprovidedbyWinIolibrary.Basedontheanalysesofhardwareprincipleandworkingmodesofparallelports,finallythroughinterfaceexperimenttheprocessofoperation,codestorealizecommunicationinapplicationprogramwithfunctionsindynamiclinklibraries(DLL)aregiven.

Keywords:parallelport;datacommunication;WinIo;PC;Windows2000/XP/NT

0 引 言

随着各种电子产品的普及,外部设备与计算机之

间的数据通信越来越成为现代设备开发的必要功能之一。并口是现代PC机上最常见的接口之一,由于一次能传输一个字节的数据,所以在计算机与外部设备进行数据传输时被广泛地采用。但是在Windows2000/XP/NT操作系统下,由于安全性的考虑,系统屏蔽了对硬件的直接访问。因此在编写关于并口的应用程序时,就不能像在DOS下一样,直接对并口进行操作。WinIo就是解决这个问题的一个办法,利用它提供的动态链接库中的函数,可以方便地在应用程序中实现对PC机并行端口的操作,从而实现与外部设备的数据传输。

1 并行端口简单介绍

从IBM2PC问世以来,并行端口主要作为打印机的端口,因此也称为打印机端口。当时的端口类型为Centronics接口,随着计算机技术的发展,并行端口的结构和性能在原有的基础上已经发生了巨大的变化,增加了EPP、ECP等高级工作方式,传输速率可达2MB/s,传输距离可以达到30英尺(10m)。目前,国

[122]

际上已经制订了统一的标准IEEE1284,PC机并行端口和扩展设备将遵循这一规范。

在图1中,并行端口在CPU的控制下工作,对I/O控制器中关于并口寄存器进行数据的读取。系统为并行端口分配了一定的I/O口地址资源,当PC机中存在并行端口时,通过控制I/O口地址来达到控制并

收稿日期:2008208226

作者简介:袁军(19832),男,重庆忠县人,西南交通大学电气工程学院硕士研究生,研究方向:形式化验证技术与嵌入式技术;谭永东(19632),男,湖北枝江人,教授,博士,研究方向:自律分布系统,无线传感器网络和工业监控;任俊(19842),男,四川江油人,西藏军区77516部队气象室助理工程师,研究方向:气象电子装备。

利用WinIo实现并口数据通信

 50计 算 机 与 现 代 化2009年第8期

行端口的目的。但是在Windows2000/XP/NT系统下,不能直接访问这些寄存器,只有借助WinIo来实现对这些寄存器的访问,

这正是本文要解决的问题。

图1 PC机中并行端口的体系结构

在通用PC机上,插口(,相对应,用这个插口可以实现PC机与外部设备的并行口互连。

根据并口标准IEEE1284的规定,并口有多种工作方式,也就是在PC机上的并行端口接口电路与外部设备通信的协议有所不同。协议的不同导致在PC机上控制的寄存器个数和寄存器各个位的定义不同。如早期的打印机就是用的兼容方式(CompatibilityMode),也称为SPP(StandardParallelPort)方式。在这种工作方式下,它只能从PC机向打印机单方向传送数据,并且每输出一个字节,都要用软件产生数据选通信号,从而实现数据传输的握手协议。数据传送率很低,一般为每秒100K到150K字节。随着计算机技术的发展,对速度的要求越来越高,同时希望数据的互传,随即出现了半字节方式(NibbleMode)、字节方式(ByteMode)、EPP方式(EnhancedParallelPort

[1,3]

Mode)、ECP方式(ExtendedCapabilityPortMode)。高级方式传输的速度越来越快,较早的工作方式使用软件来产生数据选通信号,实现传输协议,而如在ECP模式下,数据传输完全通过硬件自动完成,也就是由硬件实现数据传输中的握手协议。

在不同的工作方式下,传输协议是不同的,所以在实现数据通信时,应用程序必须根据不同的工作方式来编程。有的需要在应用程序中用软件实现传输协议,而有的工作方式只需控制数据寄存器,其余的由硬件自动完成。

通常有两种方法解决Windows2000/XP/NT下I/

[425]

O端口操作问题,一是编写一个运行在RING0级(设备驱动程序级)的虚拟设备驱动程序(c,VXD),它可以不受限制地访问硬件设备、捕获I/O端口操作和内存访问等,甚至可以截获硬件中断,这样就可以在USER方式下实现Windows2000/XP/NT下I/O端口的访问操作。I/O允许位图设置I/O端口。这允许I()按照I/O端口。

Io器和其它几种底层编程技巧,绕过了Windows系统的保护机制,从而允许在Windows2000/XP/NT下应用程序直接对I/O端口和物理内存进行操作。需要注意的是,在Windows2000/XP/NT下,WinIo函数库只允许被具有管理员权限的应用程序调用。WinIo程序库含有相应驱动程序的源代码和VisualC++例程,下载地址为:/utilities/winio.zip。

在WinIo函数库中,WinIo.DLL提供了一些函数

[6]

直接对I/O端口和物理内存进行操作。

3 在VC中借助WinIo实现并口操作

在VisualC++中,按照一般的工程建立的步骤,建立一个关于并行端口的数据传输工程后,还必须完成下面的操作才能对并口进行访问。

(1)将WinIo函数库中的winio.dll,winio.vxd和winio.sys

文件放到执行文件夹里;

(2)通过在VisualC++中的工作区间的工程名上单击右键和

选择“AddFilestoProject...”把winio.lib文件添加到工程中;

(3)在源代码文件中添加#include“winio.h”声明;(4)调用函数InitializeWinIo;

(5)调用库中的函数访问I/O端口和物理内存;(6)调用函数ShutdownWinIo。

在上面的步骤中,第5步还需要进一步细化,具体要完成的功能如下。3.1测试并行端口的存在

(1)对基地址对应的寄存器进行读写数据测试

2 WinIo简介

Windows2000/XP/NT对硬件实现了屏蔽,对I/O端口进行了严格的控制,许多在Windows9X下正

常运行的用户应用程序,在Windows2000/XP/NT中直接访问硬件会引起系统异常,因此不能在Windows2000/XP/NT下直接访问I/O端口。

端口的存在。

标准并口的地址为378H、278H或3BCH,在ECP、EPP及PS/2模式中,默认工作方式都是SPP模式,数据是单方向写。标准并行口基址(以下程序中以BasePortAddr表示)对应着数据寄存器,且该数据寄存器接有回卷寄存器,因此无论哪一种工作模式,该寄存器都是可以读写的,可以通过对该寄存器进行读写来加以判断的。

[7]

利用WinIo实现并口数据通信

 2009年第8期袁军等:利用WinIo实现并口数据通信 51

在WinIo中,利用SetPortVal(WORDwPortAddr,

DWORDdwPortVal,BYTEbSize)对端口378H、278H或3BCH写数据;利用GetPortVal(WORDwPortAddr,PDWORDpdwPortVal,BYTEbSize)读取端口378H、278H或3BCH中刚刚写入的数据。如果写入和读出的数据一致,那说明这个并口存在,否则不存在这个并口。以基地址为278H的端口为例,程序如下:

BasePortAddr=0x278;

SetPortVal(BasePortAddr,0xAA,1);GetPortVal(BasePortAddr,&pdwPortVal,1);

p=pdwPortValValGetPhysLong((PBYTE)0x408,&pdwPhysVal);//通过读

取BIOS中关于并口的基地址来确定我们能够使用的基地址

BasePortAddr=(WORD)pdwPhysVal&0x0000FFFF;//屏

蔽高位的字,将双字转换成单字

if(!BasePortAddr)

{GetPhysLong((PBYTE)0x40A,&pdwPhysVal);BasePortAddr=(WORD)pdwPhysif(!Addr)

()Val);=()!rintf("PallaralPortisError!!!\n");exit(22);//退出}}}

数据,if(p)

{SetPortVA0x55,1);GetPortVal(BasePortAddr,&pdwPortVal,1);p=pdwPortVal&0x000000FF;if(p==0x55)

printf("PallaralPortis0x278!!\n");else

printf("PallaralPortisnot0x278!!!\n");}else

printf("PallaralPortisnot0x278!!!\n");

在确定了端口的存在后,然后根据具体的并口工

作方式编程实现PC机与外部设备之间的数据传输。3.2并行端口通信实现

(2)利用BIOS数据区中关于并行口基地址的记

录来测试端口的存在。

在PC机中将一些并行端口支持内置于它的BI2OS(基本输入/输出服务)中,而BIOS是可以完成许多常规任务的一组例行程序。计算机启动以后,BI2OS程序将自动一次地检查3BCh,378h,278h这3个地址,确定这些地址是否存在并口。检查完后,BIOS程序将接口的地址存放在BIOS数据区中。所谓的BIOS数据区,就是专门为存储系统信息而保留的一部分存储空间。在这段内存中,端口地址存放在408H到40DH的范围内,LPT1置于第一位。每一个地址占用两个字节,如果未分配地址的读取结构应该是0000。在极少的情况下,BIOS数据区接下去的两个字节(40EH和40FH)存放着LPT4的地址。

在利用BIOS数据区测试并行端口的存在性时,就是读取PC机中408H到40DH范围的值,然后判断是否为零。如果不是为零,那么说明存在这个端口。在WinIo中利用GetPhysLong(PBYTEpbPhysAd2dr,PDWORDpdwPhysVal)来读取内存中的值。由于GetPhysLong是从指定的物理地址读取一个双字数据,但是在内存中存储并行端口的基地址的只有一个字,所以要屏蔽高位的字,将双字转换成单字后判断并行端口的存在。程序如下:

[3]

在并口与外部设备实现通信时,主要借助WinIo中的SetPortVal(WORDwPortAddr,DWORDdwPortVal,BYTEbSize)和GetPortVal(WORDwPortAddr,DWORDdwPortVal,BYTEbSize)来实现对并行端口寄存器的操作。只是由于在不同的工作方式下,需要处理的寄存器会有所不同,比如在较早的工作方式下(如字节方

[1,3]

),需要对它的状态寄存器和控制寄式,Bytemode

存器进行位操作(握手信号的操作),从而用软件来实现数据的传输协议。

以下是在字节方式下对控制寄存器置位的程序。因为控制寄存器相对于并行端口的基地址的偏移量是2,所以在函数GetPortVal()中的第一个参数为BasePortAddr+2;第二参数是存放函数GetPortVal()返回值的变量的指针;控制寄存器只有8位,所以第三个参数设为1。将控制寄存器的值读取出来后,按照参数bit把相应的位设为1,然后用SetPortVal(BasePortAddr+2,TranVal,1)把处理后的值返回控制寄存器就达到了置位的目的。

voidBitSet(intbit)//对控制寄存器的相应位置位{intTranVal;//中转

GetPortVal(BasePortAddr+2,&ControlPortVal,1);TranVal=ControlPortVal;switch(bit){case0:TranVal&=0xFE;break;case1:

利用WinIo实现并口数据通信

 52

TranVal|=0x02;break;case2:

TranVal&=0xFB;break;case3:

TranVal&=0xF7;break;default:break;}

SetPortVal(BasePortAddr+}

计 算 机 与 现 代 化

j=0;LOOP:

2009年第8期

GetPortVal(BasePortAddr+0x402,&ECR,1);FIFO-DETE=ECR&0x000000FF;if(!(FIFO-DETE&0x02))

{SetPortVal(BasePortAddr+0x400,Test[j],1);printf("dataout%x\n",Test[j]);j=j+1;o{p"thedatanumberis:%d\n",j);printf("theFIFOisfull!!\n");}

GetPortVal(BasePortAddr+0x402,&ECR,1);ECR-Old=ECR&0x000000FF;printf("ECRis%x\n",ECR-Old);

SetPortVal(BasePortAddr+2,0x24,1);//设置为输入

器、。随着传输协议的改进,传输的速度愈来愈快,协议也愈来愈复杂,能控制的寄存器也愈来愈多,下面以现在用得较为广泛的ECP方式为例说明在ECP方式下的数据通信。

在ECP方式下,通过设置它的扩展寄存器[2]

ECR中的7、6、5位,可以模拟不同工作方式。在本例中设置为ECP方式的测试工作模式,就是在没有外部硬件的情况下模拟ECP方式的运行,所以设置ECR的高3位为110。ECP方式下是可以双向传输数据的,且是通过的它的FIFO来实现数据通信的。在设置为向外传输时,向FIFO(地址为BasePortAddr+0x400的寄存器)写入数据,并行端口的接口电路就自动启动一个数据的向外传输,通过硬件来实现数据传输的握手信号,而不需要PC机的干预。只要FIFO里还有数据硬件电路就不停地向外传数据,同样只要FIFO没有满,PC机就可以向它写数据,通过ECR的位2来表示在向外传数据时,FIFO的状态。读取数据也一样,只要FIFO中有数据就可以读出,只要FIFO不是满的,它就不停地从外部设备读取数据。不同的是判断FIFO的状态是ECR的位1。

//———设置并口的工作模式ECP中的ECR寄存器中START:

GetPortVal(BasePortAddr+0x402,&ECR,1);ECR-Old=ECR&0x000000FF;printf("ECRis%x\n",ECR-Old);

SetPortVal(BasePortAddr+0x402,(ECR-Old&0xDF)|0xD0,1);//使ECR的765位110,为ECP工作为测试模式

GetPortVal(BasePortAddr+0x402,&ECR,1);printf("ECRis%x\n",ECR);

SetPortVal(BasePortAddr+2,0x04,1);//设置为输出状态for(i=0;i<=20;i++)//生成一组数据{Test[i]=i;}

//———向FIFO中写入数据

状态

//从FIFO中读取数据j=0;LOOP1:

GetPortVal(BasePortAddr+0x402,&ECR,1);FIFO-DETE=ECR&0x000000FF;if((FIFO-DETE&0x01))printf("theFIFOisempty!!\n");else{

GetPortVal(BasePortAddr+0x400,&ECP-DATA,1);printf("datainis%x\n",ECP-DATA);Test0[j]=ECP-DATA&0x000000FF;//printf("datais%x\n",ECP-DATA);j=j+1;gotoLOOP1;}

GetPortVal(BasePortAddr+0x402,&ECR,1);//读取ECR

寄存器

ECR-Old=ECR&0x000000FF;printf("ECRis%x\n",ECR-Old);

在一个关于并口的具体运用中,光靠PC机上的

应用程序是不够的,还需要外部设备的配合,完成并口数据的传输协议。然后利用WinIo提供的函数实现特定工作方式下的握手信号和数据传输。

4 结束语

本文从PC机的结构出发,在硬件的基础上分析并口操作的对象,介绍了在VC++编程环境下,利用Win2Io函数库实现并口操作的方法和步骤。

利用WinIo实现并口数据通信

 2009年第8期参考文献:

袁军等:利用WinIo实现并口数据通信 53

[7] 侯整风,胡军.VC++实现计算机并口的直接输入/输出

[J].淮南工业学院(自然科学版),2002,22(2):33237.[8] [美]DhanajayVGadre.并行端口编程[M].韩永彬,袁

[1] 姚放吾.IEEE1284并行接口标准与应用[J].计算机应

用,2001,21(1):52254.

[2] 宋大雷,张东来,徐殿国,等.IEEE1284标准简介[J].

潮译.北京:中国电力出版社,2000.

[9] 贾阳春,刘小丹.Windows2000下应用WDM驱动程序

电子计算机与外部设备,2000,24(1):21224.

[3] JanAxelson.并行端口大全[M].那怡超译.北京:中国

电力出版社,2001.

[4] 刘智.突破WindowsXP/2000下硬件端口访问的限制

[DB/OL]./itbookreview/view-paper.asp?paper-id=611,2003202210.

[5] 陈娇,李正明,潘天红,盛占石.WindowsNT/2000实现I-O端口直接访问[J].辽宁师范大学学报(自然

科学版),2003,26(4):3852388.

[10]远富,.WindowsI/0程序[J].

(823.

[11],.在ws),2004,35(3):3322334.[,张东来,徐殿国,等.增强型并行端口EPP及其编

境下访问底层I/O[J].加工技术(9.

[6] YarivoUnder

Windows/XP[DB/OL].,2002203202.

程方法[J].电子计算机与外部设备,2000(6):1072108.

[13]向晓安,古天祥.数据采集系统中增强型并行(EPP)接

口电路的设计[J].电测与仪表,2001,38(3):29230.

(上接第48页)参考文献:

[1] 游战清,李苏剑.无线射频识别技术(RFID)理论与应用

[M].北京:电子工业出版社,2004.

[2] 单承赣,等.射频识别(RFID)原理与应用[M].北京:电

送入MCU处理器,保证了收到信号的有效性。

2 读写器正交零中频解调实现

在读写器设计过程中,正交零中频解调采用了高

集成度的混频器和相移网络,硬件结构如图4所示,其实现过程简单,调试方便,解调性能好。正交零中频解调已在读写器实际工作中得以广泛应用

子工业出版社,2008.

[3] 董丽华,等.RFID技术与应用[M].北京:电子工业出版

社,2008.

[4] 饶元,等.面向价值链的RFID体系架构与企业应用

[M].北京:科学出版社,2007.

[5] [瑞士]Jari2PascalCurty.无源超高频RFID系统设计与

优化[M].陈力颖,毛陆虹译.北京:科学出版社,2008.[6] 周晓光.射频识别(RFID)系统设计、仿真与应用[M].

北京:人民邮电出版社,2008.

[7] 曹学军.无线电通信设备原理与系统应用[M].北京:机

械工业出版社,2007.

[8] 张益强,等.远距离无源射频识别系统设计[J].遥测遥

控,2004,25(4):45249.

[9] 黄玉兰.射频电路理论与设计[M].北京:人民邮电出版

图4 读写器硬件结构

社,2008.

[10][日]远坂俊昭.锁相环(PLL)电路设计与应用[M].北

3 结束语

本文在对UHFRFID读写器的结构及工作原理进行详细分析的基础上,构建了一个工作在UHF

RFID读写器中的射频接口模块,并根据其工作原理确定了其中所用的解调器的解调方式,并对这种解调方式的合理性进行了研究并给出了实现方法。实验证明这种解调方式简化了读写器的设计,节约了成本,而且性能也有一定的提高。

京:科学出版社,2006.

[11]黄智伟.射频功率放大器电路设计[M].西安:西安电子

科技大学出版社,2009.

[12]范博.射频电路原理与应用电路设计[M].北京:机械工

业出版社,2006.

[13]黄智伟.无线发射与接收电路设计[M].北京:北京航天

航空大学出版社,2004.

[14]李智群,等.零中频射频接收机技术[J].电子产品世界,

2004(13):69272.

本文来源:https://www.bwwdw.com/article/g4m4.html

Top