Serial Daten empfangen in Schleife

Hallo Gemeinde,

ich sende 4 Messwerte über die serielle Schnittstelle von einem Nano zu einem Mega.
Die einzelnen Werte sind durch '\t' getrennt. Einzeln funktioniert das prima.

Nun wollte ich das mittels einer Schleife realisieren.

void loop() {
  while (Serial3.available() > 0) {
    int inChar = Serial3.read();
    for (int j = 0; j < 4  ; j++) {
      inString[index] = inChar;
      if (index < 10) index++;
      if (inChar = '\t'){
      Serial.print(inString);
      index = 0;}
    }
  }
}

Die Ausgaben im ser. Monitor liefern leider nur Müll.
Was ist daran falsch?

Gruß und Dank

Hannes

Hallo,
warum immer nur alles in String- wenn es Zahlen/Ziffern sind?!
hier unter #11
steht geschrieben wie man es machen kann.
Gruß und Spaß
Andreas

Hallo Andreas,

leider beantwortet das meine Frage nicht. Ich möchte verstehen was an dem Code.Schnipsel falsch ist.

Gruß

Hannes

Du solltest den kompletten Sketch zeigen. Wie ist inString definiert?
Dann solltest Du erst mal jedes empfange Zeichen einzeln auf Serial ausgeben, um zu sehen, ob überhaupt das ankommt, wass Du vermutest.

Mehr kann man zu dem Fragment nicht sagen.

Gruß Tommy

Hallo Hannes,
"leider beantwortet das meine Frage nicht"

Ja, ja, ist nicht so einfach es Dir recht zu machen. :wink:

Ich habe in letzter Zeit ne´ Menge serielleArduinoKommunikation geübt und gelernt.

Was mir sehr geholfen hat, ist ein TerminalProgramm, das RAW-Daten ausgibt.
Da kannst Du sehr schön sehen, was denn tatsächlich gesendet wird- und dieses wunderbar mit
dem Arduino vergleichen. Das hat mir oft ziemlich auf die Sprünge geholfen.

Beantwortet Deine Frage aber auch nicht, wie Tommy56 schon sagte...
Gruß und Spaß
Andreas

Hi Tommy,

#define PUFFERLAENGE 10
#define anz 4 // Anzahl der zu empfangenden Messwerte
char inString[PUFFERLAENGE];
int index;

Der Sender:

// Sender
#define Anz 4 // Anzahl der zu sendenden Daten 
#include <SoftwareSerial.h>
SoftwareSerial TELSerial(10, 11); // RX, TX Telemetrie
int pruefsumme;
float Daten[Anz];
byte Status = 1;
union data_u {
  struct  {
    int wert[Anz];
  };
  byte bytes[10];
};
data_u data;
void setup() {
  Serial.begin(9600);
  TELSerial.begin(9600);
  data.wert[0] = 22;
  Serial.println(data.wert[0]);
}
void loop() {
  delay(1000);
  //******************Messwerte*********************************
  Daten[0] = 1;  // Testwerte
  Daten[1] = 2;
  Daten[2] = 3;
  Daten[3] = 4;
  pruefsumme = 0;
  //*********************Seriell schreiben**********************
 
  for (int j = 0; j < Anz  ; j++) {
    data.wert[j] = int ((Daten[j] * 10) + .5) ;
    Serial.print(data.wert[j]);
    Serial.print('\t');
    TELSerial.print(data.wert[j]);
    TELSerial.print('\t');
    pruefsumme += data.bytes[j * 2];
    pruefsumme += data.bytes[j * 2 + 1];
  }
  Serial.print("\tPruefsumme: ");
  Serial.println(pruefsumme);
  TELSerial.println(pruefsumme);
}

Das mit den Prüfsummen wird dann erst später ausgewertet.

Danke!

Hannes

Ist zwar allgemein schlecht angesetzt..

if (inChar = '\t') vergleicht man nicht mit == anstatt = ??


velleicht so, :
[code]
void loop() {
  while (Serial3.available() > 0) {
   int inChar = Serial3.read();   
   inString[index] = inChar;
      if (index < 10) index++;
      if (inChar == '\t'){
      Serial.print(inString);
      index = 0;}
    }
  }
}

[/code]

Hallo Andreas,

Ja, ja, ist nicht so einfach es Dir recht zu machen.

Was soll das denn? Ich habe, hoffentlich höflich genug, eine Frage gestellt. Als Anfänger gibt es davon leider reichlich. Ich denke auch Du wirst einmal angefangen haben.

Hannes

Hallo,
ich habe ein :wink: gesetzt. Kannst Du jetzt besser schlafen?
Gruß und Dank
Andreas

Hi Andreas,

ich habe ein :wink: gesetzt. Kannst Du jetzt besser schlafen?

Danke für die zusätzliche Mühe.
Deine Beiträge beeinflussen mein Privatleben wirklich nicht. :slight_smile:

Es würde, sicher nicht nur, mich freuen wenn wir das mal beenden würden.

Hannes

Hallo "Schuppeste",

das "==" bringt leider keinen Erfolg.

Danke für Deine Mühe.

Hannes

Hallo,
das ist es, was ich meine… Rate mal mit Rosenthal…

Mit dem sendest Du doch zum Empfänger?

TELSerial.print(data.wert[j]);
    TELSerial.print('\t');
TELSerial.println(pruefsumme);

und mit dem

void loop() {
  while (Serial3.available() > 0) {
    int inChar = Serial3.read();
    for (int j = 0; j < 4  ; j++) {
      inString[index] = inChar;
      if (index < 10) index++;
      if (inChar = '\t'){
      Serial.print(inString);
      index = 0;}
    }
  }
}

willst Du empfangen…

Was- sendest Du? z.B. 4711 oder "47.11" oder "Dampf"
Und was empfängst Du? Hast Du das einmal geprüft? Was kommt bei Dir an?

Wenn Du Probleme mit der serielle Übertragung hast, dann muß-
detalliert feststehen, was gesendet wird.
Also komme hier einmal mit einigen Informationen rüber.

"ich sende "47.11" als float. Da mache ich einen String draus.
Dann erstelle ich eine Prüfsumme, diese hat den Wert 13.

Bei mir kommt aber nur "11.47" an und die Prüfsumme hat den Wert 58

So, in der Art…
Gruß und Spaß
Andreas

Den Vergleich mit == anstelle von = hat Dir Schuppeste schon geschrieben.

Was zur Ausgabe noch fehlt, ist der Abschluss der Zeichenkette mit '\0', damit sie mit Serial ausgegeben werden kann.

void loop() {
  while (Serial3.available() > 0) {
   int inChar = Serial3.read();  
   inString[index] = inChar;
      if (index < 10) index++;
      if (inChar == '\t'){
        inString[index] = '\0';
        Serial.print(inString);
        index = 0;}
    }
  }
}

Mehr Infos dazu gibt es in Zeichenketten in C.

Gruß Tommy

Was ich sende steht doch in dem Beispiel.
Ich verstehe daher Deine Frage (einmal mehr) nicht.

Nochmal: Ich sende 4 Messwerte, getrennt durch '\t', und möchte diese, in einer Schleife, wieder lesen.

Das Prüfsummengedöns hat doch, bis dahin, noch nix mit meinem Problem zu tun.

Hannes

Hi Tommy,

vielen Dank. Das löst schonmal ein Problem.
Aber: Ich sende (z.B.) 10 20 30 40 bekomme aber im ser. Monitor des Empfängers:
11110000 22220000 33330000 44440000

Da ist noch irgendwo "der Wurm drin".

Gruß

Hannes

Hallo,
hier bin ich mir nicht sicher

Serial.print('\t');

das ist doch gesendetes ASCII, 92 und 116

muß das nicht

Serial.write('\t');

sein?
Gruß und Spaß
Andreas

Ich würde an deiner Stelle den Empfang der Zeile von der Analyse der Zeile trennen.

Das macht beide Routinen einfacher und es gibt keine Notwendigkeit für whiles mehr.

Man sollte blockierende Routinen meiden, nicht neue konstruieren.

Danke!
Hab jetzt Alles rausgelöscht was die Analyse angeht.
Sender:

// Sender
#define Anz 4 // Anzahl der zu sendenden Daten 
#include <SoftwareSerial.h>
SoftwareSerial TELSerial(10, 11); // RX, TX Telemetrie
int pruefsumme;
float Daten[Anz];
byte Status = 1;
union data_u {
  struct  {
    int wert[Anz];
  };
  byte bytes[10];
};
data_u data;
void setup() {
  Serial.begin(9600);
  TELSerial.begin(9600);
  data.wert[0] = 22;
  Serial.println(data.wert[0]);
}
void loop() {
  delay(1000);
  //******************Messwerte*********************************
  Daten[0] = 1;  // Testwerte
  Daten[1] = 2;
  Daten[2] = 3;
  Daten[3] = 4;
  pruefsumme = 0;
  //*********************Seriell schreiben**********************

  for (int j = 0; j < Anz  ; j++) {
    data.wert[j] = int ((Daten[j] * 10) + .5) ;
    Serial.print(data.wert[j]);
    Serial.print('\t');
    TELSerial.print(data.wert[j]);
    TELSerial.print('\t');
  }
  Serial.println(" ");
  TELSerial.println(" ");
}

Empfänger:

// Empfänger
#define PUFFERLAENGE 10
#define anz 4 // Anzahl der zu empfangenden Messwerte
char inString[PUFFERLAENGE];
int index;
void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  Serial3.begin(9600);
}
void loop() {
  while (Serial3.available() > 0) {
    int inChar = Serial3.read();
    for (int j = 0; j < anz  ; j++) {
      inString[index] = inChar;
      if (index < 10) index++;
      if (inChar == '\t'){
        inString[index] = '\0';
      Serial.print(inString);
      index = 0;}
    }
  }
}

Ich sende : 10 20 30 40 und empfange (lt. ser. Mon.): 11110000 22220000 33330000 44440000

Gruß

Hannes

Wozu willst du den zweiten int Array einsetzen?

Warum druckst du die Werte nicht einfach?

//*********************Seriell schreiben**********************
  for (int j = 0; j < Anz  ; j++) {
    int value = (int) (Daten[j] * 10 + .5);
    Serial.print(value);
    TELSerial.print(value);
    if (j != Anz - 1) {
      Serial.write('\t');
      TELSerial.write('\t');
    }
  }
  Serial.println();
  TELSerial.println();
}

Hannes54:
Hab jetzt Alles rausgelöscht was die Analyse angeht.
Empfänger:

  while (Serial3.available() > 0) {

int inChar = Serial3.read();
   for (int j = 0; j < anz  ; j++) {
     inString[index] = inChar;
     if (index < 10) index++;
     if (inChar == '\t'){
       inString[index] = '\0';
     Serial.print(inString);
     index = 0;}
   }
 }

Das Gefummel mit den Tabs ist dann bitte was?
Und was soll das for an der Stelle?
Was hat das mit dem Empfang einer Zeile (unbekannten Inhalts) zu tun?

Und überlasse loop die Iteration, mach aus dem while ein if.
Ist einfacher, kürzer und gibt dem Rest des Programms mehr Luft.

Ich habe n x Messwerte ( float) die ich übertragen muss.
Deshalb mache ich daraus (x10) int . Auf der Empfangsseite wird ein "," eingefügt.
Eine Kommastelle reicht aus.

Der Hintergrund des Ganzen:
Ich habe einen Code, dankenswerter Weise von "Agmue", bekommen der genau mein Vorhaben umsetzt.
Es werden die Messwerte richtig übertragen und das mit den Prüfsummen funktioniert auch perfekt.

Nun wollte ich, zur Synchronisation, noch ein "Startzeichen" (z.B.">") mit einbauen und noch ein Statusbyte übertragen. Ich bastel da schon lange dran herum und (außer Frust) kommt da nix Gescheites bei raus. Je mehr ich im WWW suche um so weniger scheine ich zu verstehen....
Viele Programmieraufgaben konnte ich schon lösen aber diese serielle Übertragung schafft mich noch irgendwann.
Auch das "Kochbuch" was ich mittlerweile hier habe hilft mir nicht weiter.

Da ich ähnliche Fragen schon in meinem anderen Thread (Dampfschiff) gestellt habe hoffe ich sehr kein Crossposting gemacht zu haben.

Gruß

Hannes