|
大多数计算机上的并口采用图1所示的DB-25连接器 ,表1列出了其引脚分配 。
注: 第1-13从首行开始,第14 - 25行从最后一行开始,一次从右至左排列。
方法1
如果使用Windows API,那么实现并口数字输出则会有些麻烦,主要是需要将第11脚(总线忙信号)和第12脚(纸张错误)与地之间短接起来。如果不这样,那么驱动程序会认为正在通信的打印机发生错误或者处于忙线中,而不会输出任何数据。并口会一直保持最后一次写入的值,直到该值被更新或者计算机关闭。另外在 LabVIEW 中,所有的串口通信发送的都是字符串数据,而在并口通信中,我们需要发送的是8位数值。这就需要在发送前将数据平化为字符串数据,以便其具体的二进制值不变,这里我们可以使用强制类型转换VI来实现。
如果你一次向端口发送多于一个字节的数据,驱动程序会自动按顺序发送这些数据,并且会在每次发送一个字节的时候拉低或者拉高闸门线的电平 (第1脚)。这个过程中的时序特性会因计算机的不同而有所不同,但是也存在着标准时序。要深入了解并口通信时序特性,请参考 开发者园地教程:IEEE 1284 - 更新PC的并行口
对于如何在LabVIEW中编写并口的程序,请参考 开发者园地教程范例:使用VISA来访问并行通信口 。
常见错误
请根据错误代码在 知识库 中搜索解决问题的方法。
Method 2
除了VISA VI之外,另一种向并口写入数据的方法是通过直接读写硬件寄存器实现。在LabVIEW中,我们可以通过In Port.vi和Out Port.vi的直接硬件寄存器读写来实现并口输出数据,这两个VI在 高级-I/O端口选板中。由于不使用高级的驱动,所以我们不需要对任何状态信号线进行接地处理。
注:在Windows NT或者2000中,访问底层硬件寄存器需要内核级的驱动程序。请参考知识库文章2Q1FC3K8:在Windows NT或者2000中通过LabVIEW访问硬件寄存器和物理内存 来获得更多详细信息。
访问硬件的第一件事情就是获取硬件的基地址,该信息可以在Windows的资源管理器中的资源一栏中找到。
对于Windows 9x:
对于Windows NT/2000:
并口的端口基地址一般是16进制的278、378或者3BC。并口有若干个寄存器,但是对于仅仅需要进行简单的数据输出的应用,我们只需要关心数据寄存器。该寄存器是并口I/O地址范围内的第一个寄存器,因此他的地址就是基地址,该寄存器的8位正好对应8位数据线(第2-9引脚)。我们需要做的就是通过Out Port.vi向并口写入我们需要发送的数据,如图4所示。
常见错误
更多关于并口和在LabWindows/CVI中编程的信息,请参考知识库文章0TL70ATL: Kno将并口作为输入/输出同道使用 。
方法3
正如前面提到的,使用VISA VI来实现并口数据输入是不现实不切实际的。但是,某些情况下却需要进行数据输入。一方面,无法保证8位的数据线是双向的,这个问题将在下一节中详细讨论。下面我们先假设无法实现数据的输入。幸运的是,我们可以利用其他信号线。数据寄存器后面的一个寄存器,也就是基地址+1的状态寄存器,他的5个数据位对应着25针连接器上的总线忙、传输结束、纸张完毕、选择和错误信号线。这5个状态信号正好对应着状态寄存器的第7、6、5、4、3位,如图5所示。这些状态线是已经被配置为可输入的,在于打印机通信的时候,这些信号是用来进行握手和反馈的,但是这些信号线必须进行取反操作,因为它们使用的是负逻辑。如果5根或者更少的信号线就足够了,那么我们可以直接使用In Port.vi来通过读取状态寄存器实现,如果我们需要更多的信号线,那么就需要使用控制信号线了。
控制寄存器的地址是基地址+2,与状态寄存器类似,它的某些位对应着连接器上的某些信号线,其中nStrobe, nAutoLF, nInit, nSelectIn与该寄存器的第0、1、2、3位相对应。这些信号线通常用作输出,但是它们可以被配置成双向信号线。实际上,只需要将这些信号线设置为高就可以设置为输入了。如果某个信号线被设置成高了,而在外部被某个信号接地,这时寄存器的这个数据位就会读到低。另外,需要注意的是,Strobe, nAutoLF和nSelectIn三根信号线使用负逻辑。如果我们设置使用负逻辑的信号线为低,那么实际上是在连接器一端设置其为高。如果我们想要读取一整个字节,那么我们可以读状态寄存器的高半字节和控制寄存器的低半字节,这需要在LabVIEW中进行一些二进制位处理,如图6所示,在这里仍然需要注意使用负逻辑的那些位。
注:数字逻辑的数字常量是使用二进制表示的
常见错误
在Windows NT 和2000操作系统中,需要使用访问硬件的驱动程序,请参考开发者原地范例: Windows系统下端口和内存的实用工具。另外,请确保使用访问硬件的驱动中的In Port.vi 和 Out Port.vi,而不是vi.lib中的。
某些并口的信号线可以被配置为输入,但是这取决于生厂商对并口的 设计。某些设计中,通过将数据线置高,我们可以像读取控制信号线一样读取数据线上的数据,来获取外部信号的值。但是,大多数并口需要设置传输方向位以进行输入操作,这个位是基地址+2的控制寄存器的第5位。如果并口具有输入的功能,将传输方向位置高可以将数据线设置为三态,从而可以被外部信号驱动。某些情况下,同时需要将第6位置高或者低。然而需要提到的是,某些制造商将这些位锁定了,因此在软件中无法更改,如图7所示。
通过下面步骤来检验您的并口是否可以实现数据输入:
如果读取到的值与写入的不一样,那么您的并口很大可能性是双向的。设置控制寄存器第5位禁用了数据的输出,您读取到的是输入开路情况下的端口缓存中的值。
如果读取到的值与写入的值一致,那么您的并口不是可以双向传输的。数据的输出仍然没有被禁用,读取到的是输出的数据,同时您也不可能读取到外部信号的值。
如果您的数据线是可以被用作输入的,那么您仅需要将控制寄存器的第5位置高,然后通过基地址的数据寄存器读取数据线上的值。
常见错误
通常这些问题是由于引脚11和12没有被接地,您应该将这些引脚通过跳线与18-25脚的底线连接起来,同时,请确保您没有错误地将引脚2和3接地。
串口设备需要被列在LabVIEW.ini文件中,以便在LabVIEW中使用串口兼容的VI。因为默认情况下INI文件中没有对某些引脚的描述,所以推荐使用VISA进行编程。一般来说,这些引脚应该描述如下:
串口设备="COM1; COM2; COM3; COM4; COM5; COM6; COM7; COM8; COM9; COM10; LPT1; LPT2;LPT3; LPT4;"
LabVIEW在端口序号的时候,是从0开始依次分配的,因此COM0和端口0对应,LPT1与端口11对应。
|