Hallo zusammen!
Aufgrund des Interesses an JAVA, welches mein Elektrotechnik-Studium geweckt hat, schreibe ich derzeit eine Software im Rahmen meiner Studienarbeit. Zunächst einmal ein "Danke", denn dieses Forum hat mir bei den Anfängen sehr geholfen, also schön, dass es euch gibt! :toll:
Leider habe ich derzeit ein Problem, was ich offenbar nicht alleine lösen kann: Über einen Button soll ein Thread gestartet werden, der über eine serielle Schnittstelle eine Zeichenkette (von einem Gerät) einliest. Grundsätzlich funktioniert das wunderbar; die gewünschten Zeichen erhalte ich. Ich nutze hierfür jssc.
Da im Vorfeld nicht klar ist, wie viele Zeichen übertragen werden (Das Ende des Strings wird mit einem "ENDE" signalisiert), nutze ich einen Listener, der eine zwischengespeicherte Zeichenkette genau dann erweitert, wenn ein weiteres Zeichen übertragen wurde; hierzu das Codefragment:
Wie schon zu erkennen ist, erweitert die Klasse "Thread", damit sich die aufrufende GUI-Klasse nicht "aufhängt". Dieses startet über einen Button den Thread, der natürlich bereits nach wenigen Millisekunden beendet ist (Es arbeitet ja nur noch der Listener). Wie teile ich jedoch dem aufrufenden Programm mit, dass der Port geschlossen wurde und der String abgerufen werden kann? :bahnhof: Weiterhin soll der Vorgang abgebrochen werden, sofern ein entsprechender Button betätigt wurde (Das funktioniert bisher natürlich auch nicht wie gewollt, da der Thread ja schon längst beendet ist, auch wenn noch nichts empfangen wurde). Ich hoffe ihr könnt mir helfen
Aufgrund des Interesses an JAVA, welches mein Elektrotechnik-Studium geweckt hat, schreibe ich derzeit eine Software im Rahmen meiner Studienarbeit. Zunächst einmal ein "Danke", denn dieses Forum hat mir bei den Anfängen sehr geholfen, also schön, dass es euch gibt! :toll:
Leider habe ich derzeit ein Problem, was ich offenbar nicht alleine lösen kann: Über einen Button soll ein Thread gestartet werden, der über eine serielle Schnittstelle eine Zeichenkette (von einem Gerät) einliest. Grundsätzlich funktioniert das wunderbar; die gewünschten Zeichen erhalte ich. Ich nutze hierfür jssc.
Da im Vorfeld nicht klar ist, wie viele Zeichen übertragen werden (Das Ende des Strings wird mit einem "ENDE" signalisiert), nutze ich einen Listener, der eine zwischengespeicherte Zeichenkette genau dann erweitert, wenn ein weiteres Zeichen übertragen wurde; hierzu das Codefragment:
Java:
public void run()
{
try
{
// Ein Einstellungsstring muss zunächst ausgegeben werden
serialPort.openPort();
serialPort.setParams(baudrate, databits, stopbits, parity, true, true);
char cr = 13;
einstellung = einstellung + cr;
serialPort.writeBytes(einstellung.getBytes());
// Anschließend kann auf Rückgaben gewartet werden
int mask = SerialPort.MASK_RXCHAR;
serialPort.setEventsMask(mask);
new SerialPortReader();
serialPort.addEventListener(new SerialPortReader());
} catch (Exception e)
{}
}
class SerialPortReader implements SerialPortEventListener
{
public void serialEvent(SerialPortEvent event)
{
if (event.isRXCHAR())
{
if (event.getEventValue() == 2)
{
// Bytes im input-Buffer Kontrollieren
// sobald 2 bytes (1 Zeichen) verfügbar, String erweitern
try
{
byte buffer[] = serialPort.readBytes(2);
String neu = new String(buffer);
s = s + neu;
if (s.contains("ENDE") || s.contains("ENDE"))
serialPort.closePort();
} catch (SerialPortException e)
{}
}
}
}
}
Wie schon zu erkennen ist, erweitert die Klasse "Thread", damit sich die aufrufende GUI-Klasse nicht "aufhängt". Dieses startet über einen Button den Thread, der natürlich bereits nach wenigen Millisekunden beendet ist (Es arbeitet ja nur noch der Listener). Wie teile ich jedoch dem aufrufenden Programm mit, dass der Port geschlossen wurde und der String abgerufen werden kann? :bahnhof: Weiterhin soll der Vorgang abgebrochen werden, sofern ein entsprechender Button betätigt wurde (Das funktioniert bisher natürlich auch nicht wie gewollt, da der Thread ja schon längst beendet ist, auch wenn noch nichts empfangen wurde). Ich hoffe ihr könnt mir helfen