【问题标题】:Parallel Port Communication with jnpout32pkg / jnpout32reg与 jnpout32pkg / jnpout32reg 的并行端口通信
【发布时间】:2016-04-06 15:55:39
【问题描述】:

我正在尝试通过包 jnpout32reg (http://www.hytherion.com/beattidp/comput/pport.htm) 与并行端口通信,该包是 inpout32 (http://www.highrez.co.uk/downloads/inpout32/) 的 Java 实现。我已经使用 Parallel Port Tester(下载。cnet.com/Parallel-Port-Tester/3000-2086_4-75940249.html)测试了 inpout32,这似乎工作得很好。但是,java 实现似乎不起作用。

package ioTest_reg;
import hardware.jnpout32.*;

public class ioTestReg
{
        static short datum;
        static short Addr;
        static pPort lpt;

     static void write()
     {
         datum = 0x001;
          // Notify the console
          System.out.println("Write to Port: " + Integer.toHexString(Addr) +
                              " with data = " +  Integer.toHexString(datum));
          //Write to the port
          long start = System.currentTimeMillis();
          long stop = System.currentTimeMillis();
          while (stop-start < 10000){
              lpt.output((short)0x001);
              stop = System.currentTimeMillis();
          }
          System.out.println("Finished");
     }


     static void do_read_range()
     {
          // Try to read 0x378..0x37F, LPT1:
          for (Addr=0x378; (Addr<0x380); Addr++) {
               //Read from the port
               datum = (short) lpt.input(Addr);
               // Notify the console
               System.out.println("Port: " + Integer.toHexString(Addr) +
                                   " = " +  Integer.toHexString(datum));
          }
     }


     public static void main( String args[] )
     {
        lpt = new pPort();
        Addr=0x378;
        datum=0x01;
        write();
        // Try to read 0x378..0x37F, LPT1:
        do_read_range();
    }
}

与端口的连接已建立,我可以从端口读取数据(端口 378 返回 78、379 返回 79 等...)。但是,我不能写输出。没有给出错误,但接收端没有任何反应(与并行端口测试器相反)。

当我改用 jnpout32pkg(jnpout32reg 的不同版本)时,我收到以下错误(即使我安装了所有类似的东西):

 Exception in thread "main" java.lang.UnsatisfiedLinkError:  ioTest_pkg.jnpout32.ioPort.Out32(SS)V

我做错了什么,pkg和reg有什么区别?

【问题讨论】:

    标签: java c++ parallel-processing java-native-interface parallel-port


    【解决方案1】:

    在 Alexander Heimel (http://csflab.nin.knaw.nl/protocols/parallel-port-in-matlab) 和 Douglas Beattie (http://www.hytherion.com/beattidp/comput/pport.htm) 的大力帮助下,我终于找到了解决方法。

    Python对inpout32(或inpoutx64,取决于你使用的版本)没有问题,所以我写了如下脚本。

    # import windll, to be able to load the inpoutx64.dll/inpout32.dll file
    from ctypes import windll
    import sys
    from time import sleep
    ## If no input is given, write '1' to parallel port
    address = int(888) # 0x378 in hex
    num = 1
    
    ## if two inputs are given
    if len(sys.argv) > 2:
        # cast string arguments to: 
        address = int(sys.argv[1],16) # hexadecimal integer
        num = int(sys.argv[2]) # decimal integer
    
    # load dll. 
    # Select either inpout32.dll or inpoutx64.dll, depending on which
    #  Python version you use. If you get the error:
    # WindowsError: [Error 193] %1 is not a valid Win32 application
    # You have used the wrong one. 
    p = windll.LoadLibrary("C:\\Python27\\DLLs\\inpout32.dll")
    
    # write data
    p.Out32(address,num)
    

    如果您只想发送脉冲(即之后立即将其设置回 0),请使用 sleep(0.002),然后使用 p.Out32(address,0)。接下来,您通过 Java 执行此脚本,使用以下代码完成:

    String cmd = "python C:\\Path\\To\\Code\\WriteParPort.py "+ address +" " + num;
    Process p = Runtime.getRuntime().exec(cmd);
    

    其中address为并口地址(0x378),num为要写入的值。

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多