Go Down

Topic: Serial Daten empfangen in Schleife (Read 3140 times) previous topic - next topic

Hannes54

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.
Code: [Select]
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

SkobyMobil

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
die zweite Maus bekommt den Speck...

Hannes54

Hallo Andreas,

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


Gruß

Hannes

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

SkobyMobil

#4
May 18, 2017, 01:19 pm Last Edit: May 18, 2017, 01:30 pm by SkobyMobil
Hallo Hannes,
"leider beantwortet das meine Frage nicht"

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

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
die zweite Maus bekommt den Speck...

Hannes54

Hi Tommy,

Quote
#define PUFFERLAENGE 10
#define anz 4 // Anzahl der zu empfangenden Messwerte
char inString[PUFFERLAENGE];
int index;
Der Sender:
Code: [Select]
// 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

Schuppeste

Ist zwar allgemein schlecht angesetzt..  
Code: [Select]

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]

Hannes54

Hallo Andreas,

Quote
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

SkobyMobil

Hallo,
ich habe ein  ;) gesetzt. Kannst Du jetzt besser schlafen?
Gruß und Dank
Andreas
die zweite Maus bekommt den Speck...

Hannes54

Hi Andreas,

Quote
ich habe ein  ;) gesetzt. Kannst Du jetzt besser schlafen?
Danke für die zusätzliche Mühe.
Deine Beiträge beeinflussen mein Privatleben wirklich nicht. :)

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

Hannes

Hannes54

Hallo "Schuppeste",

das "==" bringt leider keinen Erfolg.

Danke für Deine Mühe.

Hannes

SkobyMobil

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

Mit dem sendest Du doch zum Empfänger?
Code: [Select]
TELSerial.print(data.wert[j]);
    TELSerial.print('\t');
TELSerial.println(pruefsumme);

und mit dem
Code: [Select]
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
die zweite Maus bekommt den Speck...

Tommy56

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.
Code: [Select]

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Hannes54

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

Hannes54

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

Go Up