# rxtx@Seriell verweigert Ausgabe des Gerätes



## RealHAZZARD (28. Juli 2009)

Hallo Leute,

ich habe da mal ein Problem. Ich möchte einen seriellen Drucker ansteuern. Dafür verwende ich rxtx. Mein Beispielprogramm sieht so aus:

```
package example;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class StartSerial {
    private SerialPort serialPort = null;
    private InputStream inStream = null;
    private OutputStream outStream = null;
    
    private void connect(String portName)throws Exception{
        CommPortIdentifier commIdent = CommPortIdentifier.getPortIdentifier(portName);
        CommPort cp = commIdent.open(this.getClass().getName(),5000);
        if (cp instanceof CommPort){
            serialPort = (SerialPort)cp;
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            
            inStream = serialPort.getInputStream();
            outStream = serialPort.getOutputStream();
        }
    }
    
    private void getStatus() throws Exception{
        byte[] request = new byte[]{2,27,34,3};   //Fordert den Drucker auf seinen Namen zu senden.
        outStream.write(request);
        
        outStream.flush();    
        byte[] bernd = new byte[inStream.available()];
        System.out.println(bernd.length);
        inStream.read(bernd);
        System.out.println(new String(bernd));
    }
    
    public boolean isConnected(){
        return serialPort!=null&&inStream!=null&&outStream!=null;
    }
    
    public void disconnect() throws Exception{
        if(isConnected()){
            inStream.close();
            outStream.close();
            serialPort.close();
        }
    }
    
    public static void main(String[] args) throws Exception{
        StartSerial ss = new StartSerial();
        ss.connect("COM1");
        ss.getStatus();
        ss.disconnect();
    }

}
```

Der Durcker empfängt den Befehl auch. Das habe ich getestet.
Aber nun zu meinem Problem:
Ich bekomme keine Ausgabe vom Drucker. Ich habe auch schon so einiges hin und her probiert, aber es will nicht funktionieren.
Und das Beste daran: Wenn mein Programm durchgelaufen ist.Schaue ich mir COM1 mit Putty an und schon sehe ich sie Ausgabe des Druckers.
Ich habe auch schon 10 Sekunden gewartet bevor ich den inputstream gelesen habe. Aber auch dann ist da nichts zu holen.
Das Programm läuft einfach ohne Fehler durch und im Inputstream stehen 0 bytes.

BTW: Die erste Zeile in connect(...) braucht 5 - 10 Sekunden, bevor es weiter geht.



Weiß einer Rat?


----------



## Steiner_B (28. Juli 2009)

Ich programmiere derzeit an einer UMTS-Karte mit rxtx, die verlangt nach jedem Befehl das Zeichen 0x0D. Probier das mal.

Weiters:
Ich würde mir für das ganze eine von SerialPortEventListener abgeleitete Klasse schreiben und im serialEvent alle Meldungen verarbeiten die von der Karte kommen.

Wenn das nicht geht/du nicht so viel ändern willst würde ich zumindestens vors empfangen folgendes schreiben

```
while (inputStream.available() < = 0)
   Thread.sleep(100);
```

ev. musst du dann noch ein Timeout o.ä. einbauen


----------



## RealHAZZARD (28. Juli 2009)

Hallo,

danke ersteinmal für die schnelle Antwort. An das <CR> (0D) habe ich auch schon gedacht. Ich habe es natürlich auch umgesetzt, aber das brachte auch keinen Erfolg. Hab es auch mit allen anderen Steuerzeichen versucht. 
Den Eventlisteneransatz hatte ich auch schon mal probiert. Da trat selbst mit Warteschleifen nie ein Event auf. Das Threading habe ich gerade noch einmal nachgebastelt. 

```
public class StartSerial {
    private SerialPort serialPort = null;
    private InputStream inStream = null;
    private OutputStream outStream = null;
    
    private void connect(String portName)throws Exception{
        CommPortIdentifier commIdent = CommPortIdentifier.getPortIdentifier(portName);
        
        CommPort cp = commIdent.open(this.getClass().getName(),5000);
        if (cp instanceof CommPort){
            serialPort = (SerialPort)cp;
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            inStream = serialPort.getInputStream();
            Thread t1 = new Thread(new Reader(inStream));
            t1.start();
            outStream = serialPort.getOutputStream();
            System.err.println("setup done");
        }
    }
    
    private void getStatus() throws Exception{
        byte[] request = new byte[]{2,27,110,49,3,2,27,34,3};   //0x03,0x02,27,34 | 2,27,34,3 | 2,27,96,3
        outStream.write(request);
        outStream.flush();
    }
    
    public boolean isConnected(){
        return serialPort!=null&&inStream!=null&&outStream!=null;
    }
    
    public void disconnect() throws Exception{
        if(isConnected()){
            inStream.close();
            outStream.close();
            serialPort.close();
        }
    }
    
    public static void main(String[] args) throws Exception{
        StartSerial ss = new StartSerial();
        ss.connect("COM1");
        ss.getStatus();
        ss.disconnect();
    }
    private class Reader implements Runnable{
        private InputStream input;
        private Reader(InputStream is){
            input = is;
        }
        @Override
        public void run() {
            try{
                while (input.available() <= 0) Thread.sleep(200);
                byte[] buffer = new byte[input.available()];
                System.out.print(new String(buffer));
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
    }
}
```


 Aber egal wie lange ich warte. Es kommt keine Antwort. Die Antwort kann ich mir dann im Putty abholen. 
Ich befürchte der Stream bekommt wirklich nie Daten.


----------



## Steiner_B (28. Juli 2009)

Noch zwei Vorschläge:
1. Kommen überhaupt keine Daten an (available() immer 0) oder kommen zwar Daten und sie verschwinden dann beim Anzeigen. (kannst du mit einer Statusausgabe nach der sleep(200);-Schleife feststellen

2. Stimmt vielleicht die Bautrate von 9600 nicht? Wenn du da die falsche eingestellt hast können alle Möglichen intereressanten Dinge passieren


----------



## RealHAZZARD (29. Juli 2009)

Ich habs, ich habs.

Es war eigentlich nur ein Fehler des Programmierers (ist es ja meistens ;-))
In der Doku zu diesem Drucker steht eigentlich, dass der Drucker XON/XOFF braucht. Nun hat sich aber rausgestellt, dass er einen Hardwarehandshake haben möchte.
Kaum war der berücksichtigt schon ging es.
Danke für deine Mühe!


----------



## Steiner_B (29. Juli 2009)

Kein Problem, hab übrigends grad ein ähnliches Problem mit einem GPS-Empfänger, da krieg ich auch keine Daten, aber wenn Putty verbindet seh ich alles.

Kannst du mir vielleicht noch genauer schreiben wie du das Problem jetzt behoben hast?


----------



## RealHAZZARD (7. August 2009)

Hi,

sry, dass ich erst jetzt antworte, aber ich habe einfach eine Einstellung setzen müssen. Die FlowControl!

```
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            serialPort.setInputBufferSize(512);
            serialPort.setFlowControlMode(/*SerialPort.FLOWCONTROL_NONE*/ SerialPort.FLOWCONTROL_RTSCTS_IN);
```

Das ist meine Initialkonfiguration. Des Weiteren kann es sein, dass das angeschlossene Gerät selbst noch weitere Formalitäten braucht.
Beispiel: Der angesprochene Drucker erwartet als erstes Zeichen immer <STX> (Steuerzeichen) und als letztes <ETX>. Sollten Blöcke länger als 15 Byte sein muss ich sie mit <ETB> trennen.


----------

