Я пытаюсь связаться с параллельным портом через пакет jnpout32reg (http://www.hytherion.com/beattidp/comput/pport.htm), реализация Java inpout32 (http://www.highrez.co.uk/downloads/inpout32/). Я протестировал inpout32 с помощью параллельного тестера портов (скачать. Cnet. Com / Parallel-Port-Tester / 3000-2086_4-75940249.html), который, кажется, работает отлично. Тем не менее, реализация 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?
С некоторой большой помощью от Александра Heimel (http://csflab.nin.knaw.nl/protocols/parallel-port-in-matlab) и Дуглас Битти (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);
В котором адрес является адресом параллельного порта (0x378), а num является записываемым значением.
Других решений пока нет …