• LabVIEW中使用并口


    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对应。

    更详细的内容,参加如下附件的介绍。

    LabVIEW、LabVIEW开发、LabVIEW编程、LabVIEW程序

    上文中提到的例子和资料,均在word中的附件里,可点击下载。进一步了解,可联系们。

    LabVIEW中使用并口 - 北京瀚文网星科技有限公司 (bjcyck.com)

  • 相关阅读:
    初级软件测试面试题哪里可以刷?新发现的这个在线题库,值得一试
    HTML5期末考核大作业 简单的学生网页作业源码 基于html css javascript仿王者荣耀首页 游戏网站开发 游戏官网设计与实现
    Cell子刊综述:药物研发进入智能生成时代
    4.cuBLAS开发指南中文版--CUDA 数据类型引用
    力扣 556. 下一个更大元素 III
    《雷达原理》课程笔记-第一章:绪论
    FFplay文档解读-45-视频过滤器二十
    springboot236基于springboot在线课程管理系统的设计与实现
    2022年最新湖北水利水电施工安全员考试题库及答案
    Golang - api中生产数据,另一个进程控制并发数去消费api中生产的数据
  • 原文地址:https://blog.csdn.net/bjcyck/article/details/124916618