利用WinIo实现并口数据通信(4)
时间:2025-07-09
时间:2025-07-09
利用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函数库实现并口操作的方法和步骤。
下一篇:《为三月谱曲》