[Leider keine Lösung hier!]Communication Arduino -> Java -> Arduino -> Java usw.

Hallo, seit einiger Zeit arbeite ich an folgender Aufgabe:

Hard- und Software:
Arduino UNO R3,
Schnittstelle: JSSC

Thema:
Datenaustausch von Arduino -> Java -> Arduino -> Java -> usw.

Aufgabe:
Der Arduino misst einen LDR-Wert (oder Poti), schickt diesen an das Java-Programm. Java entscheidet dann, dass die LED bei einem LDR-Wert > 500 eingeschaltet werden soll und bei einem LDR-Wert <= 500 ausgeschaltet werden soll. Dann schickt das Java Programm den Wert selbständig, also ohne einen Event (Klick etc.) an den Arduino. Der Arduino sendet dann wieder den aktuellen LDR-Wert automatisch an das Java-Programm und das Spiel geht wieder von vorne los. Hin und her ohne, dass ich da irgendetwas drücken muss.
Die Aufgabe soll später noch komplexer werden.

Problem:

Das Java-Programm empfängt die LDR-Werte vom Arduino. Die LDR-Werte welche das Java-Programm empfängt sind jedoch z.T. bruchstückhaft (z.B. S50, E, 00E).
Es gelingt mir nicht im gleichen Programm dann wieder Informationen von Java zum Arduino zu schicken. (In separaten Programm funktioniert das schon)

Erläuterung:

Arduino Sketch:
Hier verpacke ich den LDR-Wert zwischen einem Startmarker „S“ und einen Endmarker „E“.

#define LED_2 13
int analogPin = A1;
int analogWert = 0;
int onoff = 0;
String string="";
void setup() {
  Serial.begin(9600);
  pinMode(LED_2, OUTPUT);
}

void loop() {
  analogWert = analogRead(analogPin);
  string = "S"+String(analogWert)+"E";
  Serial.println(string);
  Serial.flush();
  delay(50);
  while(Serial.available()){
    onoff = Serial.read();
  }
  digitalWrite(LED_2, onoff);
}

Java-Programm
Soll den empfangenen String dann bereinigen und wie oben beschrieben „auswerten“. Die Zeile „poti = Integer.parseInt(value);“ ist auskommentiert weil sonst läufts gar nicht.
In der folgenden if-Schleife sollte die Auswertung erfolgen, der Wert „hilo“ dann entsprechend belegt werden und mit sepo.writeInt(hilo); an den Arduino geschickt werden.

package transmit;

import javax.swing.JFrame;

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

public class Transmit_001 extends JFrame implements SerialPortEventListener{
 // Define COM3 port
 private SerialPort sepo = new SerialPort("COM3");
 private String value;
 private int poti;
 private int hilo;
 private boolean toogle=false;
 
 // Constructor
 public Transmit_001(){
 try{
 sepo.openPort();
 sepo.setParams(9600, 8, 1, 0);
 sepo.addEventListener(this);
 }catch(SerialPortException ex){
 System.out.println(ex);
 }
 SendReceive();
 }
 
 private void SendReceive(){
 try{
 sepo.writeInt(hilo);
 }catch(SerialPortException ex){
 System.out.println(ex);
 }
 }
 
 @Override
 public void serialEvent(SerialPortEvent spe){
 try{
 // String empfangen und säubern
 value += sepo.readString();
 value=value.replaceAll("null", "");
 value=value.replaceAll("\n", "");
 value=value.replaceAll("\r", "");
 if(value.indexOf("S")==0 && value.indexOf("E")>0){
 value=value.substring(1, value.indexOf("E"));
 }
 // Kontrollausgabe
 System.out.println("Received: " + value);
 }catch(SerialPortException ex){
 System.out.println(ex);
 }
 // Auswertung und LED hilo (HIGH/LOW) bestimmen
// poti = Integer.parseInt(value);
 value="";
 // Auswertung
// if(poti >= 500)
 hilo=1;
// else
// hilo=0;
 System.out.println("LED: " + hilo);
 }
 
 public static void main(String[] args) {
 Transmit_001 trans01 = new Transmit_001();
 }

}

Ich habe auch schon mit FLOWCONTOL probiert, leider ohne Erfolg.
Kann mir da jemand bitte helfen?
Danke Quax
[]

Wofür brauchst Du da JAVA, das kann der Arduino allein :wink:

Lass die Klasse String auf den Arduino weg und benutze char-Arrays für Zeichenketten.

Ein Beispiel für die Steuerung einer RGB-LED (also etwas komplexer) mit Processing (JAVA) und Arduino habe ich hier in diversen Ausbaustufen mal vorgestellt.

Gruß Tommy

Erstmal vielen Dank für die schnelle Antwort.
Es ist mir sehr wohl bewußt, dass das der Arduino alleine kann und das wohl auch ziemlich einfach. Aber das ist ja erst der Anfang einer komplexeren Aufgabe.
Ich denke das Hauptproblem liegt in meinem Java-Programm. Hat denn da jemand eine Idee bitte?
Danke
Quax

Im Java musst Du die Eingaben vom User sammeln und die z.B. als Zeichenkette an die serielle Schnittstelle schicken und diese auf dem Arduino wieder zerlegen. Umgekehrt genauso. Wir sind hier kein JAVA-Forum, da wirst Du derartige Fragen wohl nicht beantwortet bekommen.

Gruß Tommy

Ja im Grunde schicke ich auch immer Strings hin und her. Wie bereits Eingangs erwähnt in separaten Programmen gelingt mir das auch. Ich habe etwas den Eindruck, dass der SerialPort dann in Java entweder nicht freigegeben wird oder erst gar nicht angesprochen wird.
Als ich das Arduino-Java Problem hier reingestellt habe war ich mir nicht sicher ob ich in dem Arduino-Forum hier eine Antwort bekomme - aber ich probier es einfach. Letztendlich soll die Thematik dazu dienen den Arduino als "Schnittstelle zur Aussenwelt" für den PC zu dienen. Das also auf dem PC mittels eines Java-Programmes eine GUI läuft oder auch z.B. Messwerte vom Arduino visualisiert werden können. Darum der ganze Aufwand.
Leider tue ich schon ziemlich lang rum mit dieser Problematik. Hab auch schon viel im Internet rumgesucht. Vielen Dank für deine Tipps. Bin da für jeden Hinweis sehr dankbar. Möchte aber trotzdem den Thread hier noch nicht schließen.
Quax

Hast Du Dir mal Processing angeschaut?

Gruß Tommy

Ja hab ichmir auch schon mal angeschaut. Da werde ich aber eher probieren das Problem mit Python zu lösen. Aber das muss doch mit Java lösbar sein, anders kann ich mir das nicht vorstellen.
Gruß Quax

Natürlich ist das mit JAVA lösbar, wenn Du JAVA programmieren kannst.

Gruß Tommy

Hallo Thommy,
erstmal vielen Dank für deine Hinweise und Bemühungen.
Ich werde dann mal woanders weitersuchen.
Wie kann ich denn hier jetzt diesen Thread schließen oder gar auch löschen?
Danke Quax

Warum willst Du den löschen? Unsere Beiträge kannst Du nicht löschen und wenn Du Deine löäschst, würden die ohne Beziehung im Raum stehen. So was macht man nicht.
Du würdest Dir damit einen sehr schlechten Ruf in der Forenwelt erarbeiten.

Gruß Tommy

Was du machen kannst, wenn du das für sinnvoll hältst:
Nimm dir deinen ersten Eintrag nochmal vor ( More - Modify ) und editiere den Titel in
[erledigt] Communication Arduino -> Java -> Arduino -> Java usw.

oder so. Kannst auch statt dessen [Aufgegeben, Keine Lösung hier] voranstellen. :slight_smile:

Kannst auch die Moderatoren bitten, den Topic gegen weitere Änderungen zu blockieren, aber das ist eher unüblich hier und ob Uwe das macht, bleibt ihm überlassen..
In ein paar Tagen gerät der Beitrag von allein aus dem Blickfeld und gut ist.

Ja das sind gute Anregungen vielen Dank Euch.
Servus Quax