java c++ parallel-processing jni parallel-port

java - Comunicación de puerto paralelo con jnpout32pkg/jnpout32reg



c++ parallel-processing (1)

Estoy tratando de comunicarme con un puerto paralelo a través del paquete jnpout32reg ( http://www.hytherion.com/beattidp/comput/pport.htm ), una implementación de Java de inpout32 ( http://www.highrez.co.uk / downloads / inpout32 / ). He probado inpout32 con un probador de puerto paralelo (descargar .netnet.com/Paralel-Port-Tester / 3000-2086_4-75940249.html), que parece funcionar perfectamente. Sin embargo, la implementación de Java no parece funcionar.

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(); } }

La conexión con el puerto está hecha y puedo leer desde los puertos (el puerto 378 devuelve 78, 379 devuelve 79, etc. ...). Sin embargo, no puedo escribir la salida. No se da ningún error, pero no ocurre nada en el lado de recepción (a diferencia de con el probador de puerto paralelo).

Cuando uso jnpout32pkg (una versión diferente de jnpout32reg), obtengo el siguiente error (aunque lo instalé todo de manera similar):

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

¿Qué estoy haciendo mal y cuál es la diferencia entre pkg y reg?


Con gran ayuda de Alexander Heimel ( http://csflab.nin.knaw.nl/protocols/parallel-port-in-matlab ) y Douglas Beattie ( http://www.hytherion.com/beattidp/comput/pport. htm ) Finalmente logré encontrar una solución.

Python no tiene ningún problema con inpout32 (o inpoutx64, dependiendo de la versión que use), así que escribí el siguiente script.

# 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)

Si solo desea enviar un pulso (es decir, vuelva a establecerlo en 0 inmediatamente después), use sleep(0.002) , seguido de p.Out32(address,0) . A continuación, ejecuta este script a través de Java, que se realiza con el siguiente código:

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

En qué dirección se encuentra la dirección del puerto paralelo (0x378), y num es el valor que se va a escribir.