Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 26 - Drucken

## 26.4 Zugriff auf serielle und parallele Schnittstellen

- 26.4 Zugriff auf serielle und parallele Schnittstellen
  - 26.4.1 Das Java Communications API
    - Installation
    - Prinzipielle Arbeitsweise
  - 26.4.2 Ein einfaches Beispielprogramm

Sollten die in den vorangegangenen Abschnitten vorgestellten Drucktechniken nicht funktionieren oder auf Grund praktischer Schwierigkeiten nicht einsetzbar sein, gibt es eine Reihe anderer Möglichkeiten, Daten unter Java auszudrucken. Die aufwendigste und flexibelste von ihnen besteht darin, die Druckdaten selbst aufzubereiten und direkt an die serielle oder parallele Schnittstelle zu senden, an der der Drucker angeschlossen ist. Wir wollen in diesem Abschnitt kurz skizzieren, wie das mit Hilfe des Java Communications API durchgeführt werden kann.

|  |  |  | Vor Einsatz dieser Technik sollten ihre Nachteile bedacht werden. Einerseits ist der Aufwand unter Umständen sehr groß, denn die Anwendung muß alle Low-Level-Details der Druckeransteuerung selbst implementieren. Das umfaßt die Auswahl und Belegung der Schnittstelle ebenso wie das Generieren der druckerabhängigen Steuersequenzen. Zweitens ist das Verfahren nicht sonderlich portabel. Zwar gibt es das Communication API als JDK-Standarderweiterung sowohl für SOLARIS als auch für Windows, auf anderen Systemen steht es aber unter Umständen nicht zur Verfügung. Auch Drucker, die nicht über die serielle oder paralle Schnittstelle angesteuert werden (z.B. USB- oder Netzwerkdrucker), können auf diese Weise naturgemäß nicht angesteuert werden. |  |
Warnung

### 26.4.1 Das Java Communications API

#### Installation

Das Java Communications API ist eine Standarderweiterung des JDK und recht einfach zu installieren. Es kann von http://java.sun.com/products/javacomm/index.html heruntergeladen oder der CD-ROM zum Buch entnommen werden. Bei vorhandenem JDK 1.4 sieht die Installation wie folgt aus:

- Zunächst ist die Installationsdatei javacomm20-win32.zip in ein separates Verzeichnis zu entpacken.
- Nun müssen einige Dateien kopiert werden (wir gehen hier davon aus, daß das JDK sich im Verzeichnis c:\jdk1.4 befindet):
  - win32com.dll nach c:\jdk1.4\jre\bin
  - comm.jar nach c:\jdk1.4\jre\lib\ext
  - javax.comm.properties nach c:\jdk1.4\jre\lib

Für das JDK 1.4 ist die Installation des Communications APIs nun abgeschlossen. Bei einem anderen JDK oder auf einem anderen Betriebssystem ist unter Umständen anders vorzugehen. Weitere Informationen können der Datei Readme.html entnommen werden.

#### Prinzipielle Arbeitsweise

Das Communications API liegt im Paket `javax.comm`. Die Klasse `CommPortIdentifier` dient zur Beschreibung von Kommunikationsports. Sie besitzt eine statische Methode `getPortIdentifiers`, mit der eine `Enumeration` von `CommPortIdentifier`-Objekten erzeugt werden kann, die ein Element je verfügbarem Port enthält. Zusätzlich kann mit der statischen Methode `getPortIdentifier` auch direkt auf einen namentlich bekannten Port zugegriffen werden:

    public static Enumeration getPortIdentifiers()

    public static CommPortIdentifier getPortIdentifier(String portName)
      throws NoSuchPortException
| javax.comm.CommPortIdentifier

Wurde ein `CommPortIdentifier` beschafft, können seine Eigenschaften abgefragt werden:

    public String getName()

    public int getPortType()
| javax.comm.CommPortIdentifier

`getName` liefert den Namen des Ports (z.B. "COM1" oder "LPT1" unter Windows, "/dev/..." unter UNIX). `getPortType` gibt entweder `PORT_PARALLEL` oder `PORT_SERIAL` zurück, je nachdem, ob es sich um eine parallele oder serielle Schnittstelle handelt.

Soll über einen Port kommuniziert werden, muß sein zugehöriger `CommPortIdentifier` durch Aufruf von `open` geöffnet werden:

    public synchronized CommPort open(String appname, int timeout)
      throws PortInUseException
| javax.comm.CommPortIdentifier

Die beiden Parameter geben den Namen der zu verwendenden Applikation und die maximale Zeitspanne, die beim Öffnen gewartet wird, an. Der Rückgabewert von `open` ist vom typ `CommPort` und kann in eine der (daraus abgeleiteten) Klassen `ParallelPort` oder `SerialPort` umgewandelt werden.

Die wichtigsten Methoden von `CommPort` sind `getInputStream` und `getOutputStream`. Sie beschaffen die zum Lesen bzw. Schreiben von Daten verwendeten Streams:

    public InputStream getInputStream()
      throws IOException

    public OutputStream getOutputStream()
      throws IOException
| javax.comm.CommPort

Darüber hinaus stellen `CommPort` und die daraus abgeleiteten Klassen einige Methoden zur Verfügung, mit denen Kommunikationsparameter eingestellt, Puffergrößen geändert oder Portzustände abgefragt werden können. Zudem bieten beide Klassen die Möglichkeit, Event-Listener zu registrieren, die bei Zustandsänderungen oder eingehenden Daten automatisch benachrichtigt werden. Wir wollen auf all diese Möglichkeiten nicht weiter eingehen; sie werden in der Dokumentation ausführlich beschrieben.

### 26.4.2 Ein einfaches Beispielprogramm

Zum Abschluß dieses Abschnitts soll ein einfaches Beispielprogramm gezeigt werden, das über die parallele Schnittstelle Daten an einen Drucker schickt. Es durchsucht zunächst die Liste aller Schnittstellen nach einem Parallelport mit dem Namen "LPT1" (unter UNIX müßte dieser Name entsprechend angepaßt werden). Dieser wird geöffnet, und mit `getOutputStream` ein `OutputStream` zum Schreiben von Daten beschafft. Nun gibt das Programm fünfzig Zeilen lang Teilstrings von "Hello LPT1 World" aus und sendet dann das Seitenendezeichen "\f" an den Drucker. Zum Schluß werden Ausgabestream und Port geschlossen und das Programm beendet.

    001 /* Listing2604.java */
    002
    003 import java.util.*;
    004 import java.io.*;
    005 import javax.comm.*;
    006
    007 public class Listing2604
    008 {
    009   public static void printHello(Writer out)
    010   throws IOException
    011   {
    012     String s = "Hello LPT1 World";
    013     s += " " + s + " " + s;
    014     for (int i = 1; i <= 50; ++i) {
    015       out.write(s.substring(0, i) + "\r\n");
    016     }
    017     out.write("\f");
    018   }
    019
    020   public static void main(String[] args)
    021   {
    022     Enumeration en = CommPortIdentifier.getPortIdentifiers();
    023     while (en.hasMoreElements()) {
    024       CommPortIdentifier cpi = (CommPortIdentifier)en.nextElement();
    025       if (cpi.getPortType() == CommPortIdentifier.PORT_PARALLEL) {
    026         if (cpi.getName().equals("LPT1")) {
    027           try {
    028             ParallelPort lpt1 = (ParallelPort)cpi.open(
    029               "LPT1Test",
    030               1000
    031             );
    032             OutputStreamWriter out = new OutputStreamWriter(
    033               lpt1.getOutputStream()
    034             );
    035             printHello(out);
    036             out.close();
    037             lpt1.close();
    038             System.exit(0);
    039           } catch (PortInUseException e) {
    040             System.err.println(e.toString());
    041             System.exit(1);
    042           } catch (IOException e) {
    043             System.err.println(e.toString());
    044             System.exit(1);
    045           }
    046         }
    047       }
    048     }
    049   }
    050 }
| Listing2604.java

Listing 26.4: Druckausgabe an LPT1

Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de