📄 sy1201.htm
字号:
<html>
<HEAD>
<TITLE>Visual C++与计算机接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312">
</HEAD>
<body>
<font color="#0000FF">计算机与外设的通信方式</font>
<p>
(一)实验目的:<BR>
了解计算机与外设的通信方式<BR><BR>
(二)基础知识<BR><BR>
1、设备寄存器<BR>
CPU为了能够控制外部设备或与外部设备进行数据交换,需要通过读写与设备相关联的寄存器同外围设备进行通信。这些设备寄存器可分为:<BR>
·命令寄存器,这些寄存器中的位以某种方式控制设备——可以是启动或放弃数据传输或者设备配置。<BR>
·状态寄存器,这些寄存器通常供CPU读取,反映设备的当前状态。<BR>
·数据寄存器,这些寄存器用来在设备和计算机间传输数据。<BR>
简单的设备(如并口)只有几个相关的寄存器,而复杂的硬件(如显卡)有许多寄存器。寄存器的数量和用途完全由硬件设计者定义,使用时可查阅设备的说明书。<BR><BR>
2、访问设备寄存器<BR>
通常,设备寄存器位于连续的地址空间上。因此,第一个寄存器的地址是访问其他寄存器必须的线索。<BR>
CPU对外部设备的设备寄存器的访问方式有两种:I/O端口地址访问和存储器映像访问。<BR><BR>
(1) 存储器映像访问方式<BR>
有些设备的设备寄存器可以直接映射到CPU的内存空间上,也就是说,我们可以直接读写物理内存中的某一段地址,来完成对某个设备的控制或读取设备的数据,当然,这段地址是由设备本身规定的。<BR>
例如,在DOS下编程时,可以使屏幕进入图象模式,例如640*480*16色或320*200*256色,此时,从0xA000开始的内存地址,就被显卡占用,以存放在屏幕上显示的各像素颜色值。我们可以直接修改这段内存的内容,以实现在屏幕上的绘图。<BR><BR>
(2) I/O端口地址访问方式<BR>
在许多种类的CPU中,会准备一块单独的总线和地址空间,这些地址称为端口地址或I/O地址,它们与内存地址完全隔离,需要用特别的I/O指令来访问。<BR>
在Intel的CPU中,I/O端口地址是64K,即0x0000至0xFFFF,其中0x0000-0x00FF间的地址只用于主板上的设备,0x0100-0x03FF间的地址用于插入式板卡。<BR><BR>
在现在的计算机系统中,已经基本上都是即插即用的设备,对它们的访问,通常都要经过驱动程序。<BR><BR>
3、驱动程序<BR>
现在,通常,每个与计算机相连接的外部设备都会带有驱动程序。<BR>
设备驱动程序提供连接到计算机的硬件的软件接口,应用程序或计算机系统可以通过驱动程序以一种规范的方式访问硬件,而不必考虑控制硬件的细节。<BR>
驱动程序是一个软件,在装入后成为操作系统内核的一部分。它使一个或多个设备可被使用,每个设备代表一个物理的或逻辑的硬件。<BR>
在Windows中,驱动程序总是使设备看起来像是一个文件,可以打开设备的一个句柄,然后应用程序可以在设备句柄关闭之前向驱动程序发出读写请求。<BR><BR>
(三)数据采集设备访问实例<BR><BR>
1、存储器映像访问方式<BR><BR>
IMP是英国一家公司生产的一种数据采集器,主要用于采集温度信号或一些缓变的动态信号,每个IMP由10或20个通道。<BR>
IMP的通过插入计算机内的IMP4A卡和特定网线,可将最多32台IMP串联成一个网络,由一台计算机进行控制和采集数据。<BR>
IMP4A卡与计算机的通信是采用内存映像方式,它将自己的设备寄存器映射到从0xCA00或0xD000起的512个字节中。应用程序可以访问或修改这些地址,以控制IMP设备或读取采集到的数据。<BR><BR>
SelPage(CONFIG_PAGE); //选择控制页<BR>
for(i=0x100-1;i>=0;i--) *(pImp4A+i)=0x0; //初始化<BR>
*(pImp4A+0x0100)=0x0C0; //启动IMP<BR>
<BR>
SelPage(TX_PAGE); //选择命令页<BR>
for(i=0;i < len;i++) *(pImp4A+i)=*(sCommand+i); //将命令字符串放入映像内存<BR>
SelPage(CONFIG_PAGE); //选择控制页<BR>
*(pImp4A+0x0E8)=0x80; //传输命令<BR>
<BR>
do{<BR>
bl=(*bImpAdd-1)*4;<BR>
al=*(pImp4A+bl);<BR>
}while((al & 0x80) == 0); //等待命令执行<BR>
<BR>
SelPage(bImpAdd+1); //选择相应的IMP数据页<BR>
BYTE a=*(pImp4A+bImpChannel*2+0);<BR>
BYTE b=*(pImp4A+bImpChannel*2+1);<BR>
WORD wValue=a+b*256; //得到相应IMP相应通道的数据<BR><BR>
2、I/O端口地址访问方式<BR><BR>
PCLD818数据采集卡是台湾研华生产的一种数据采集卡,它有16路AD通道和16路DI通道,每路AD通道还可以由PCLD788卡扩展接到16路信号上。
PCLD818卡可以设置采样频率和输入范围,可以用于采集振动数据和其它动态信号。<BR>
PCLD818卡的控制方式是通过I/O端口地址访问方式插入计算机内的IMP4A卡和特定网线,可将最多32台IMP串联成一个网络,由一台计算机进行控制和采集数据。<BR>
PCLD818卡与计算机的通信是采用I/O端口地址访问方式,计算机通过从它的基地址开始的32字节的I/O端口对它进行控制和读取采集到的数据。<BR>
PCLD818卡中设有FIFO的缓存,通常在数据半满时开始读取数据。<BR><BR>
_outp(w818Add+1,8); //设置输入范围为+/-10伏<BR>
_outp(w818Add+2,2); //设置采集通道<BR>
_outp(w818Add+13,11); <BR>
_outp(w818Add+14,71); //通过13号和14号寄存器设置采样频率为5K<BR>
_outp(w818Add+25,FIFOEMPTY); //清空FIFO标志<BR>
do <BR>
{<BR>
state=_inp(w818Add+25); //检测FIFO标志<BR>
if((state & RG_HALFFULL)==RG_HALFFULL) //if it is half full<BR>
{<BR>
bADLow=_inp(w818Add+23); //读低位<BR>
bADHigh=_inp(w818Add+24); //读高位<BR>
bChannelID=bADLow&0x0f; //计算当前数据属于哪一个818通道<BR>
data[n]=(bADLow&0xf0)/16+bADHigh*16;<BR>
n++;<BR>
}<BR>
}while(n < len); //缓冲区装满数据则返回<BR><BR>
3、通过驱动程序的访问方式<BR><BR>
通过外部设备的驱动程序,也可以对外部设备进行访问。<BR>
对于标准设备,可以通过调用Windows API进行编程,这些Windows API会调用相应的驱动程序与硬件通讯,例如前面实验的声卡编程和视卡编程。<BR>
对于其他设备,则一般来说,需要设备制造者提供开发包SDK,它通常是一个或多个DLL。开发者通过调用DLL里的函数,间接的调用驱动程序与硬件通讯。例如前面实验的视卡SDK编程<BR><BR>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -