Supportnet / Forum / Anwendungen(Java,C++...)
Java - Parallelport auslesen
Frage
Hallo,
Ich suche zur Zeit nach einer Möglichkeit den Parallelport mit Java auszulesen.
Genau gesagt, möchte ich über die einzelnen Zustände der Pins erfahren (ob Spannung anliegt oder nicht).
Ich hoffe ihr könnt mir weiterhelfen, eventuell sogar Beispielprogrammen.
Vielen Dank Im Voraus
Henning
Antwort 1 von semi
Es gibt dazu u.a. JavaCOMM API.
Beispiel aus JDCTechTips 2002 Mehr Beispiele findest Du sicherlich im dazugehörigen Tutorial oder über Google.
Gruß,
Michael
Beispiel aus JDCTechTips 2002 Mehr Beispiele findest Du sicherlich im dazugehörigen Tutorial oder über Google.
Gruß,
Michael
Antwort 2 von Henning
Mit der standartdokumentation vom Api kann ich aber nicht viel anfangen, weil es da nur um drucken geht
wie gesagt, ich brauche eine möglichkeit die spannungszustände an den Pins abzufragen.
wie gesagt, ich brauche eine möglichkeit die spannungszustände an den Pins abzufragen.
Antwort 3 von semi
Exakte Spannungswerte kriegst Du wahrscheinlich nicht raus. Es ist TTL und die Zustände an den Pins haben eine gewisse Toleranz.
Alternativ kannst Du mit JNI darauf zugreifen und den Zugriff auf die Schnittstelle in C++ programmieren. Nichts anderes tut aber die COMM API. Die Zustände der Pins kriegst Du raus, wenn Du das Daten und/oder Status-Byte ausliest und die bits maskierst. (soviel zur Theorie :-))
Ich habe hier keine Beispiele zur Hand aber es muss ganz einfach gehen.
Ich habe mal vor langer Zeit eine Schrittmotorsteuerung über die Centronics Schnittstellen gemacht. War aber damals in Turbo Pascal (1992)
Alternativ kannst Du mit JNI darauf zugreifen und den Zugriff auf die Schnittstelle in C++ programmieren. Nichts anderes tut aber die COMM API. Die Zustände der Pins kriegst Du raus, wenn Du das Daten und/oder Status-Byte ausliest und die bits maskierst. (soviel zur Theorie :-))
Ich habe hier keine Beispiele zur Hand aber es muss ganz einfach gehen.
Ich habe mal vor langer Zeit eine Schrittmotorsteuerung über die Centronics Schnittstellen gemacht. War aber damals in Turbo Pascal (1992)
Antwort 4 von Henning
Ich wollte ja auch nicht die exakten Spannungswerte in volt, ich möchte lediglich wissen ob ein Signal an einen Pin anliegt oder nicht.
Aber ich bräuchte hier dringend ein Beispiel , weil ich auf diesem Gebiet der Java -Programmierung nicht so fit bin
Aber ich bräuchte hier dringend ein Beispiel , weil ich auf diesem Gebiet der Java -Programmierung nicht so fit bin
Antwort 5 von Henning
Traumhaft wäre es natürlich wenn das ganze ein event wäre.
also so wie bei den Buttons:
Wenn man draufklickt, dann passiert was...
und beim Parallelport:
Wenn ein Signal auf den Pin kommt, dann passiert was....
also so wie bei den Buttons:
Wenn man draufklickt, dann passiert was...
und beim Parallelport:
Wenn ein Signal auf den Pin kommt, dann passiert was....
Antwort 6 von semi
Ich habe leider nichts zum Testen um ein konkretes Beispiel zu schreiben.
Es sollte aber ungefähr wie folgt gehen:
Gruß,
Michael
Es sollte aber ungefähr wie folgt gehen:
import javax.comm.*;
import java.util.TooManyListenersException;
public class ReadLPT implements Runnable, ParallelPortEventListener, CommPortOwnershipListener
{
CommPortIdentifier portId = null;
ParallelPort port = null;
public ReadLPT(String portIdentier) throws NoSuchPortException
{
this.portId = CommPortIdentifier.getPortIdentifier(portIdentier);
this.portId.addPortOwnershipListener(this);
Runtime.getRuntime().addShutdownHook(
new Thread(){
public void run() {
System.out.println("Shutdown");
if(portId!=null)
portId.removePortOwnershipListener(ReadLPT.this);
closePort();
}
}
);
openPort();
}
public void ownershipChange(int type)
{
switch(type)
{
case CommPortOwnershipListener.PORT_OWNED:
System.out.println("PORT_OWNED: " + this.portId.getCurrentOwner());
break;
case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED:
closePort();
break;
case CommPortOwnershipListener.PORT_UNOWNED:
openPort();
break;
}
}
public void parallelEvent(ParallelPortEvent event)
{
switch(event.getEventType())
{
case ParallelPortEvent.PAR_EV_BUFFER:
readBuffer();
break;
case ParallelPortEvent.PAR_EV_ERROR:
readError();
break;
}
}
private synchronized void openPort()
{
try
{
port = (ParallelPort)portId.open("ReadLPT", 3000);
port.addEventListener(this);
port.notifyOnBuffer(true);
port.notifyOnError(true);
System.out.println("Port opened");
}
catch(PortInUseException e)
{
System.out.println("PortInUseException: " + e);
}
catch(TooManyListenersException e)
{
System.out.println("TooManyListenersException: " + e);
}
}
private synchronized void closePort()
{
if(this.port!=null)
{
port.removeEventListener();
port.close();
port = null;
System.out.println("Port closed");
}
}
private void readBuffer()
{
System.out.println("readBuffer");
// InputStream holen und port.getInputBufferSize() bytes lesen
}
private void readError()
{
System.out.println("readError");
// port.isPrinterTimedOut()
// port.isPrinterError()
// port.isPaperOut()
}
public void run()
{
try
{
while(true)
Thread.sleep(60000);
}
catch(InterruptedException e)
{
if(portId!=null)
portId.removePortOwnershipListener(this);
closePort();
}
}
public static void main(String[] args)
{
try
{
(new Thread(new ReadLPT("LPT1"))).start();
}
catch(NoSuchPortException e)
{
System.out.println("LPT1 is wech!");
}
}
}Das Lesen des InputStreams findest Du in den Beispielen zu COMM. das ganze hier ist nur so auf die Schenlle getippt. Fehler nicht ausgeschlossen :-)Gruß,
Michael
Antwort 7 von henning
Wow , Ich bin dir zu Dank verpflichtet
Antwort 8 von semi
Noch etwas. Folgendes musst Du vorher tun
copy comm.jar \jdk1.x\jre\lib\ext
copy win32com.dll \jdk1.x\bin
copy javax.comm.properties \jdk1.x\jre\lib
Ausführen
java -Djava.library.path=....\jdk1.x\bin ReadLPT
Ich hoffe, es hilft Dir etwas.
Gruß,
Michael
copy comm.jar \jdk1.x\jre\lib\ext
copy win32com.dll \jdk1.x\bin
copy javax.comm.properties \jdk1.x\jre\lib
Ausführen
java -Djava.library.path=....\jdk1.x\bin ReadLPT
Ich hoffe, es hilft Dir etwas.
Gruß,
Michael

