Hallo Richard,
kann ich es auch innerhalb einer Klasse irgendwie erreichen, die while-Schleife zu umgehen?
Ich habe es derzeit wie folgt (Auszug)
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 das Instrument antwortet, durchsuche ich den String nach einem Umbruch (\n), das ist das Zeichen, dass der Response vollständig ist.
Nun setz ich die Variabel hasResponse auf true.
Der Aufruf sieht nun wie folgt aus:
serialStream.sendRequest( "Hallo Welt" );
serialStream.getResponse();
Ich stelle als eine Anfrage und fage *sofort* nach der Antwort des Instrumentes. Da diese natürlich auf sich warten lässt, überbrück ich die Zeit in einer leeren while-Schleife:
while (this.hasSendRequest && !this.hasResponse){ /** do nothing... **/ }
Sowas lässt sich doch sicher schöner lösen, oder?
Mit freundlichem Gruß
Micha