Outputstream write() gets blocked using RXTX to communicate with HC-05 BT Module

Ich sitze mittlerweile seit fast einer Woche an diesem Problem und habe schon in etlichen Foren nach Hinweisen gesucht. Leider bis heute ohne Erfolg.

Das ist mein Problem: Ich versuche einen Befehl an ein Bluetooth HC-05 Modul zu senden, welches über einen virtuellen COM Port mit dem PC verbunden ist. In meinem Fall "COM4".

Ich benutze die RXTX Bibliothek um mich mit dem Serial Port zu verbinden. Das funktioniert auch ohne Probleme.

Java:
public static void main(String[] args) {
    portList = CommPortIdentifier.getPortIdentifiers();
    boolean portFound = false; 
    while (portList.hasMoreElements()) {
        portId = (CommPortIdentifier) portList.nextElement();
        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
             if (portId.getName().equals("COM4")) {
                 portFound = true;
                SimpleRead reader = new SimpleRead();
            }
        }
    }
}

@SuppressWarnings("restriction")
public SimpleRead() {
    try {
        serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
    } catch (PortInUseException e) {System.out.println(e);}
    try {
        serialPort.setOutputBufferSize(15);
        serialPort.setEndOfInputChar((byte)'\n');
        inputStream = serialPort.getInputStream();
        outputStream = serialPort.getOutputStream();
    } catch (IOException e) {System.out.println(e);} catch (UnsupportedCommOperationException e)
        e.printStackTrace();
    }
    try {
        serialPort.addEventListener(this);
    } catch (TooManyListenersException e) {System.out.println(e);}

    serialPort.notifyOnDataAvailable(true);
    try {
        serialPort.setSerialPortParams(300,
            SerialPort.DATABITS_8,
            SerialPort.STOPBITS_1,
            SerialPort.PARITY_NONE);            
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
    } catch (UnsupportedCommOperationException e) {System.out.println(e);}
    serialPort.setRTS(true);
    serialPort.setDTR(true);
    serialPort.notifyOnDataAvailable(true);
    serialPort.setInputBufferSize(8192);
    serialPort.setOutputBufferSize(8192);

    writeThread = new Thread(new SerialWriter(outputStream));
    writeThread.start();

    readThread = new Thread(this);
    readThread.start();     
}

Das Problem tritt im Schreibe-Thread auf. Wenn die writeTo() Methode des ByteArrayOutputStream Objekts aufgerufen wird, bleibt das Programm einfach hängen, ohne eine Exception zu schmeißen.

Java:
public class SerialWriter implements Runnable{
OutputStream out;

public SerialWriter (OutputStream out)
{
    this.out = out;
}

public void run (){     
    try{
        Thread.sleep(500);
        while (true){
            out.flush();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos.write("AT\n".getBytes(Charset.forName("ASCII")));
            baos.writeTo(out); //<-- Here is my Problem. The program just hangs up
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }  
        }                
    }
    catch (IOException e){
        e.printStackTrace();
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }            
}
}

Ich benutze Windows 8.1 in der 64bit Version.

Ich kann mich übrigens mittels HTERM Konsole mit dem Bluetooth Modul verbinden.

Ich bin für jeden Tip/Hilfe wirklich dankbar!!
 
was passiert denn wenn du hier mal nicht nur eine InterupptedExeption einträgst sondern einfach mal allgemein Exception, wirft er dir dann irgendeine Exception aus ?

Java:
  } catch (InterruptedException e) {


EDIT : Quark ... hier in zeile 24 natürlic...trag einfach mal nur Exception ein und schau ob er dir irgendwas ausgibt

Java:
    catch (IOException e){
da du hier nur die Exception des sleeps abfängst dürfte klar sein das er dir keine Ausgabe der Ursache ausgibt, ist aber nur so ein gedankengang 🙂
 
Zuletzt bearbeitet:
Hallo kaoZ,

danke für deine Antwort. Ich werde das später mal testen.
Allerdings scheint das Programm nicht abzustürzen, sondern verharrt nur an der Methode writeTo().
 
Laut dem hier, blockiert die Methode nicht beim Lesen, also blockiert dein OutputStream.
Das heisst, es kommen über den OutputStream des SerialPort-Objekts einfach keine Daten zum verarbeiten rein. Dein Problem liegt also demnach nicht in SerialWriter sondern in dem oberen Teil des Codes...
 
Das gleiche Problem tritt aber auch dann auf, wenn ich die Methode write() des Outputstreams direkt aufrufe. Muss ich dem Outputstream vorher noch irgendetwas mitteilen?
 
Ich habe auch schon das flush() eingebaut. Allerdings kommt das Programm ja gar nicht so weit, weil vorher das Programm ja schon beim write() stehen bleibt.
Ein flush() vor dem write() bringt übrigens auch nichts :-(
 
Schon so versucht?

Code:
 while (true){
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos.write("AT\n".getBytes(Charset.forName("ASCII")));
            baos.writeTo(out); //<-- Here is my Problem. The program just hangs up
            baos.flush();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
Wie er schon sagt: es blokiert bei writeTo - flush wird nicht erreicht.
Aber wie ich schon sagte: Der OutputStream, der dort als Parameter angegeben wird blockiert das Ganze wahrscheinlich eher...
 
was könnte denn die Ursache sein, dass out blockiert wird? In meinem anderen Thread warte ich auf die Antwort des Moduls und frage jede Sekunde den InputStream ab. Mit dem Outputstream mache ich dort aber nichts.
 

Zurück
Oben