Supportnet Computer
Planet of Tech

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

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.

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)


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

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....



Antwort 6 von semi

Ich habe leider nichts zum Testen um ein konkretes Beispiel zu schreiben.
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


Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: