利用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.
正在阅读:
利用WinIo实现并口数据通信05-21
悬挑脚手架施工方案04-20
XX年最新乡镇换届党委工作报告05-23
预算单位财务服务平台-出纳管理操作手册10-14
专题2:时尚美学06-03
常见急危重症的快速识别要点05-31
广东省揭阳市08-09学年高一下学期期末考试(政治理)08-12
正确对待金钱02-13
新闻经济文艺演示文稿07-27
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 并口
- 数据通信
- 利用
- 实现
- WinIo
- 数据库系统原理与应用(第3章 关系数据库)
- 酒店布草洗涤合同
- 10kV~500kV输变电及配电工程质量验收与评定标准
- 2016安徽公务员考试申论辅导:文章写作注意事项
- (5)CK立磨结构性能及工作原理讲座(肖杰玉)
- Q SQR 04 737-2007 油漆涂层耐高压清洗性能试验方法
- 驾照考试科目一理论考试的一些记忆技巧
- 未成年人零犯罪社区创建工作总结
- 马丁路德宗教改革
- 中华人民共和国招标投标法实施条例
- 环保工程及服务Ⅱ行业:PPP清库将结束,拥抱龙头静待估值提升
- 简析土地资源保护问题与对策
- 《计算机组成原理》课堂练习7,分章练习第七章
- 2014四川省现代预防医学试题及答案
- 轻度侧脑室增宽胎儿的产前超声诊断和临床评估_吴岩
- 双侧子宫动脉化疗栓塞术治疗剖宫产子宫切口妊娠
- 武汉大学研发中心2012任务书
- 护理干预对2型糖尿病高危人群生活方式的影响
- 店长述职报告通用范本
- 2018-2019人教版一年级语文下册学习能力测试卷(全套)