Hallo Leute,
nachdem ihr bei meinem letzten Problemchen schon so gut geholfen habt, hier mal mein aktuelles Problemchen.
Ich möchte gern Daten vom µC per RS232 in den Pi einlesen. Dafür benutzt ich die "pi4j" Lib. Das Beispiel was dabei ist funktioniert auch super. Daten senden und empfangen geht damit problemlos. Aber ich möchte die Daten ja nicht per Konsole ausgeben, sondern im Programm weiter verarbeiten.
Also habe ich das Beispiel einfach etwas angepasst.
Original sah es so aus:
// create an instance of the serial communications class
final Serial serial = SerialFactory.createInstance();
// create and register the serial data listener
serial.addListener(new SerialDataListener() {
@Override
public void dataReceived(SerialDataEvent event) {
// print out the data received to the console
System.out.print(event.getData() + System.getProperty("line.separator"));
}
});
Display More
Dann habe ich für die Konsole eine globale Variable eingefügt
und den entpsrechenden Code in der Schleife:
ersetzt.
Das funktioniert scheinbar irgendwie, nur leider wird kein Event mehr ausgelöst der in die Variable was reinschreibt. Es wird also nur "null" zurück gegeben. Ausserdem wird kein Datum mehr gesendet. Also wird die komplette Funktion der Seriellen Schnittstelle irgendwie blockiert.
Nach etwas Suchen bin ich im Forum von pi4j auf ein Beitrag gestoßen, wo jemand das selbe Problem hat. Beitrag im pi4j Forum
Dort wurde empfohlen, als "quick and dirty" Methode, der Klasse einfach eine public Variable anzufügen. Was ich ja bereits gemacht habe. Da wird auch darauf hingewisen, dass im Fall von lange laufenden Schleifen, es zu Empfangsprobleme auf der Schnittstelle kommen kann. Ich habe allerdings nur eine Schleife die sekündlich durchläuft und das serial.readData einfach nur aufruft.
Edit: Oder liegt das daran, dass ich den Sekundentakt mittels Thread.sleep(1000); erzeuge? Weil das heißt ja, dass er einfach mal 1000ms nichts tun soll. Mist, ich glaube den Fehler habe ich gerade selber gefunden :s.
Als super Lösung wird darauf hingewisen, dass man einen eigen Thread für den Empfang bauen soll und den dann syncronisieren muss. Und hier bin ich total überfragt, weil ich das noch nie gemacht habe. Ich habe mal ein Thread Beispiel gebastelt wo zwei Threads einfach Variablen hoch zählen. Aber das mit dem Syncronisieren raff ich irgendwie noch nicht.
Aber mal als Frage, hat jemand ein Beispiel, wie man das Problem lösen kann und würde das mal posten. Dann habsch mal ein funktionierendes Beispiel wie es geht
Danke,
Arno