Im Beipsiel der COMM-API SimpleRead wird ein Thread gestartet. Welchen nutzen hat dieser und vor allem, warum wird dieser 20 sec unterbrochen?
Meine zweite Frage ist, wie kann ich den Status einer Variable überwachen - bzw. wie geht man hier vor? Wenn ich von der Schnittstelle etwas zurückbekomme, könnte ich ja bspw. einen boolischen Wert von false auf true setzen.
Wenn ich den Wert direkt abfrage, ist er jedoch noch false, da die Antwort noch nicht gesendet bzw. noch unvollständig ist. In einer while-Schleife laufend den Statuswert zu prüfen, erscheint mir auch stark fragwürdig.
Was soll das heißen? Das ein Thread 20 Sekunden warten muss? Gleichzeitig läuft solange ein anderer (*skeptisch kuck*)? Ich hatte mal was von 20 Millisekunden gelesen und nicht von 20000. Egal...
das hatte ich mir bereits durchgelsen, trotzdem danke. Für meinen Anwendungsfall scheint das nicht erforderlich zu sein. Es gibt keinen zweiten Prozess. Ich sende eine Anfrage und bekomme eine Antwort. Erst jetzt kann ich eine weitere Anfrage stellen. Es gibt keine nebenläufigen Prozesse - zumindest sehe ich im Moment keine.
Wie siehts mit meiner zweiten Frage aus? Ich würde gern die Antwort von dem Gerät, das an der Schnittstelle hängt, als Methode zur Verfügung stellen. Als ganz primitiv:
Code:
public String getResponse(){
return res;
}
Wenn ich aber eine Anfrage gestellt habe und dann direkt die Antwort abfrage, ist sie natürlich nicht nicht da. Ich bräuchte eine Art Listener oder so?!
Code:
public String getResponse(){
//warte bis Antwort da ist und gib aus
return res;
}
vll hat ja noch einer eine Idee. derzeit habe ich es mit der While-Schleife gelöst. Das sieht aber irgendwie nicht so toll aus:
Code:
public class SerialStream implements Runnable, SerialPortEventListener {
//.....
public void sendRequest(String messageString){
try {
this.hasSendRequest = true;
this.outputStream.write( messageString.getBytes() );
this.response = new String("");
this.hasResponse = false;
//this.readThread = new Thread(this);
//this.readThread.start();
} catch (IOException e) {
this.hasSendRequest = false;
System.err.println("Fehler "+e);
}
}
public String getResponse(){
while (this.hasSendRequest && !this.hasResponse){ /** do nothing... **/ }
this.hasSendRequest = false;
return this.response;
}
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
byte[] readBuffer = new byte[20];
try {
while (this.inputStream.available() > 0) {
int numBytes = this.inputStream.read(readBuffer);
}
String resStr = new String(readBuffer);
this.response += resStr.trim();
//System.out.println(new String(response));
if (resStr.indexOf("\n")!=-1){
//System.out.println(this.response);
this.hasResponse = !this.response.isEmpty();
}
} catch (IOException e) {
System.err.println("Fehler "+e);
}
}
}
//......
}
Wenn also in der Antwort des an der Rs232-Schnittstelle befindlichen Gerätes ein Zeilenumbruch enthalten ist, setzte ich die Variabel hasResponse auf true. In der Methode getResponse() läuft eine while-Schleife, bis sich der Status ändert und springt dann zum return. Mit einer Zeitabfrage könnte man hier noch eine Endlosschleife verhindern.
Aber die Schleife selbst finde ich schon unschön und suche eine Alternative.