利用WinIo实现并口数据通信(3)

时间:2025-07-09

利用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:

…… 此处隐藏:129字,全部文档内容请下载后查看。喜欢就下载吧 ……
利用WinIo实现并口数据通信(3).doc 将本文的Word文档下载到电脑

精彩图片

热门精选

大家正在看

× 游客快捷下载通道(下载后可以自由复制和排版)

限时特价:7 元/份 原价:20元

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219