LabVIEW中使用并口
总的来说,对并口进行简单的端口数字IO操作是比较简单方便的,本文将讨论如何通过VISA或者底层寄存器编程来实现该功能,同时也包括对在此过程中可能遇到的一般错误、错误信息和其他问题的说明和讨论。本文并不关心和处理信号握手、PC与PC的点对点通信,而只在必要的时候讨论IEEE-1284规范中规定的特性与通信方式。
概述
并口一般用来向打印机或者其他设备发送数据,它每次发送一个字节或者8位二进制数。并口25针连接器上除了数据线外,主要包括状态线、控制线和地线。状态线和控制线一般用来在与打印机通信的时候,实现握手、命令发送和接收反馈。而在进行某些应用的时候,需要格外考虑对这些信号线,以更好的利用并口。在Windows操作系统环境中,如果使用与串口一样的API进行编程,则并口能够获得的性能是有限的。这意味着,在Windows操作系统环境中,可以使用与串口通信时相同的 VISA VI来实现输出数据。然而, Windows操作系统中,这些API本身没有内建对数据接收的支持,尽管在某些情况下,硬件支持接收数据,但是软件不支持该功能。但是这并不意味着在LabVIEW中实现并口数据的输入, 尽管这确实意味着VISA VI不支持并口数据输入。
大多数计算机上的并口采用图1所示的DB-25连接器 ,表1列出了其引脚分配 。
注: 第1-13从首行开始,第14 - 25行从最后一行开始,一次从右至左排列。
方法1
如果使用Windows API,那么实现并口数字输出则会有些麻烦,主要是需要将第11脚(总线忙信号)和第12脚(纸张错误)与地之间短接起来。如果不这样,那么驱动程序会认为正在通信的打印机发生错误或者处于忙线中,而不会输出任何数据。并口会一直保持最后一次写入的值,直到该值被更新或者计算机关闭。另外在 LabVIEW 中,所有的串口通信发送的都是字符串数据,而在并口通信中,需要发送的是8位数值。这就需要在发送前将数据平化为字符串数据,以便其具体的二进制值不变,这里可以使用强制类型转换VI来实现。
如果一次向端口发送多于一个字节的数据,驱动程序会自动按顺序发送这些数据,并且会在每次发送一个字节的时候拉低或者拉高闸门线的电平 (第1脚)。这个过程中的时序特性会因计算机的不同而有所不同,但是也存在着标准时序。
常见错误
-1073807330 (BFFF003E) - I/O错误,VISA 无法完成操作。
错误37,使用串口兼容性VI
请根据错误代码在 知识库 中搜索解决问题的方法。
Method 2
除了VISA VI之外,另一种向并口写入数据的方法是通过直接读写硬件寄存器实现。在LabVIEW中,可以通过In Port.vi和Out Port.vi的直接硬件寄存器读写来实现并口输出数据,这两个VI在 高级-I/O端口选板中。由于不使用高级的驱动,所以不需要对任何状态信号线进行接地处理。
访问硬件的第一件事情就是获取硬件的基地址,该信息可以在Windows的资源管理器中的资源一栏中找到。
在计算机桌面上,我的电脑上单击右键,选择属性。
选择硬件选项卡,然后选择资源管理器按钮。
在端口(COM & LPT)下面找到LPT1。
双击LPT1。
接下来选择资源选项卡,这时输入/输出范围下面会出现端口地址。
并口的端口基地址一般是16进制的278、378或者3BC。并口有若干个寄存器,但是对于仅仅需要进行简单的数据输出的应用,只需要关心数据寄存器。该寄存器是并口I/O地址范围内的第一个寄存器,因此他的地址就是基地址,该寄存器的8位正好对应8位数据线(第2-9引脚)。需要做的就是通过Out Port.vi向并口写入需要发送的数据,
常见错误
In Port.vi 或者 Out Port.vi返回"功能不支持"错误"
更多关于并口和在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所示,在这里仍然需要注意使用负逻辑的那些位。
注:数字逻辑的数字常量是使用二进制表示的
常见错误
In Port.vi 或者 Out Port.vi返回"功能不支持"错误
在Windows NT 和2000操作系统中,需要使用访问硬件的驱动程序,请参考开发者原地范例: Windows系统下端口和内存的实用工具。另外,请确保使用访问硬件的驱动中的In Port.vi 和 Out Port.vi,而不是vi.lib中的。
某些并口的信号线可以被配置为输入,但是这取决于生厂商对并口的 设计。某些设计中,通过将数据线置高,可以像读取控制信号线一样读取数据线上的数据,来获取外部信号的值。但是,大多数并口需要设置传输方向位以进行输入操作,这个是基地址+2的控制寄存器的第5位。如果并口具有输入的功能,将传输方向位置高可以将数据线设置为三态,从而可以被外部信号驱动。某些情况下,同时需要将第6位置高低。然而需要提到的是,某些制造商将这些位锁定了,因此在软件中无法更改。
通过下面步骤来检验您的并口是否可以实现数据输入:
设置控制寄存器的第5位为高(寄存器地址为基地址+2)。
端口上不连接任何信号的情况下,向并口写入一些值,并在每次写入后进行读取。
如果读取到的值与写入的不一样,那么您的并口很大可能性是双向的。设置控制寄存器第5位禁用了数据的输出,您读取到的是输入开路情况下的端口缓存中的值。
如果读取到的值与写入的值一致,那么您的并口不是可以双向传输的。数据的输出仍然没有被禁用,读取到的是输出的数据,同时您也不可能读取到外部信号的值。
如果您的数据线是可以被用作输入的,那么您仅需要将控制寄存器的第5位置高,然后通过基地址的数据寄存器读取数据线上的值。
常见错误
In Port.vi 或者 Out Port.vi返回"功能不支持"错误。
在Windows NT 和2000操作系统中,需要使用访问硬件的驱动程序,请参考开发者原地范例: Windows系统下端口和内存的实用工具 。另外,请确保使用访问硬件的驱动中的In Port.vi 和 Out Port.vi,而不是vi.lib中的。
LabVIEW因为串口写入兼容的VI而死机
通常这些问题是由于引脚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;"
niLabVIEW在端口序号的时候,是从0开始依次分配的,因此COM0和端口0对应,LPT1与端口11对应。