Daten vom MEGA zum NODEMCU

Hallo,

ich komme mal wieder nicht mehr weiter.
Ich möchte Daten vom MEGA zum NODEMCU übertragen. Es geht um einen String mit Messwerten in der Form 727.30694.05694.063322.640.000.000.000.00/.
Es sind 8 Werte, getrennt mit * und als Ende (oder Anfang) einen /.
Ich bin so weit: Die Daten werden über die Seriell2 alle paar Sekunden von MEGA gesendet.
Hier habe ich Anregung für die SoftwareSerial für den NODEMCU gefunden.

//Soft-Serial am NODEMCU

#include <SoftwareSerial.h>

SoftwareSerial swSer(13, 15, false, 256);

void setup() {
  Serial.begin(9600);
  swSer.begin(9600);

  Serial.println("\nSoftware serial test started");

  for (char ch = ' '; ch <= 'z'; ch++) {
    swSer.write(ch);
  }
  swSer.println("");

}

void loop() {
  while (swSer.available() > 0) {
    Serial.write(swSer.read());
  }
  while (Serial.available() > 0) {
    swSer.write(Serial.read());
  }

}

Meine Zechenfolge wird auch schön am Monitor (ARDUINO-IDE) dargestellt, ich schaffe es aber nicht die einzelnen Werten zu trennen und am besten in einem Array mit X Elementen zu speichern.
Wäre schön wenn mir jemand helfen könnte oder bin ich total auf den Holzweg oder gäbe es einen besseren Weg?

Gruß Uwe

Da hilft die Zeichenkettenverarbeitung von C. Lies Dir alles in ein Chararray ein. Wenn Du / erkennst, schließe das Array mit '\0' ab. mit '\n' (LF) als Endezeichen findest Du da genug Routinen im Forum.

Danach sollte Dir strtok weiter helfen.

Anregungen dazu gibt es hier.

Gruß Tommy

So, jetzt tut es wenigstens ein bisschen. Wenn ich die ersten beiden Zeilen nach loop aus kommentiere, klappt es. Dann kann man mit diversen Serial.print-Ausgaben sehen wie die Daten ankommen und zerlegt werden.

Aber mit den beiden Zeilen geht das nicht mehr… Irgendwie kommt da alles durcheinander. Sobald in der loop-Schleife noch irgendwas anderes drin steht geht der Teil nicht mehr oder nicht mehr richtig…

Irgendwelche Ideen??? So kann ich das vergessen.

// Software Serial am NODEMCU
//
//
#include <SoftwareSerial.h>
#include "SPI.h"

SoftwareSerial swSer(13, 15, false, 256);

char  input[200];  // puffer für die Daten
char  current;     // puffer für empfangenes Zeichen
int   incount = 0;           // Zähler zum schreiben in den Puffer
int   lfdNr   = 0;
bool  lineComplete = false; //
float array[20];

//--------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  swSer.begin(9600);

  Serial.println("");
  Serial.println("\nSoftware serial test started");

  for (char ch = ' '; ch <= 'z'; ch++)    // Zeichensatz senden
  {
    Serial.print(ch);
    swSer.write(ch);
  }
  Serial.println("");
  swSer.println("");
}

//--------------------------------------------------------------------------------
void loop()
{
  lfdNr ++;
  Serial.println(lfdNr);

  char delimiter[] = "*";
  char *ptr;
  String Wert = "";
  int X = 0;
  while ((swSer.available()) & (incount < 100) & (!lineComplete))
  {
    current = swSer.read(); // aktuelles Zeichen einlesen
    if (current != 47)            // ist das empfange Zeichen kein /
    {
      // dann in den Puffer schreiben
      input[incount] = current;
      incount++;
    }
    else                          // Ende Zeichenkette
    {
      // puffer mit NULL Zeichen abschließen, damit das Ende der Zeichenkette
      // durch string Operationen erkannt wird
      input[incount] = '\0';
      lineComplete = true;
    }
  }
  // so wenn man hierher kommt, dann kann das drei Gründe haben:
  // - keine zeichen mehr an der seriellen Schnittstelle
  // - Puffer voll, aber noch kein Zeilenende
  // - Zeilenende erreicht
  if (lineComplete) {
    //    Serial.println("Line Complete");
    Serial.println(input);
    //    Serial.println(strlen(input));
    // initialisieren und ersten Abschnitt erstellen
    X = 0;
    ptr = strtok(input, delimiter);
    while (ptr != NULL)
    {
      // naechsten Abschnitt erstellen
      Wert = ptr;
      array[X] = Wert.toFloat();
      X++;
      ptr = strtok(NULL, delimiter);
    }
    lineComplete = false;
    incount = 0;
    // input ist eine Zeichenkette mit den Werten, durch ein Leerzeichen getrennt
    // weiter mit String Operationen
  }
  else if (incount == 200)
  {
    Serial.println("Buffer voll!!!");
    // - Puffer voll, aber noch kein Zeilenende
    // tja, mach was immer Du denkst
  }
}

Irgendwelche Ideen?

Ja!

Ich hatte mir mal vor ein paar Jahren einen INT Parser geschrieben. Den verwende ich aber immer noch…
Mit etwas Anpassung evtl nutzbar:

      int32_t Nummer1 = 0;
      int32_t Nummer2 = 0;
      int32_t Nummer3 = 0;
      uint16_t EndPos = ZahlSuchen(aBytes, nBytes, &Nummer1, 0);
      EndPos = ZahlSuchen(aBytes, nBytes, &Nummer2, EndPos);
      EndPos = ZahlSuchen(aBytes, nBytes, &Nummer3, EndPos);
uint16_t ZahlSuchen(char *Text, uint16_t AnzBytes,  int32_t *Nummer, uint16_t Start)
{
  int8_t Mul = 1;
  if (Start < 0) return -1;
  // Zahlen-Anfang finden
  // String nach dem ersten Vorkommen und dem letzten Vorkommen einer Zahl durchsuchen
  int16_t StartPos = -1;
  int16_t EndPos = -1;

  // Start und Ende finden
  for (uint16_t i = Start; i < AnzBytes; i++) {
    if (Text[i] >= 48 && Text[i] <= 57 && StartPos < 0) StartPos = i;
    if ((Text[i] < 48 || Text[i] > 57) && StartPos >= 0 && EndPos < 0) EndPos = i - 1;
    if (i == (AnzBytes - 1) && EndPos < 0) EndPos = i;
  }
  if (StartPos < 0 || EndPos < 0) return -1; // Keine Zahl gefunden

  // Zahlen Verarbeiten
  uint8_t Len = EndPos - StartPos;  // Länge berechnen
  *Nummer = 0;  // Nummer initialisieren
  if (Text[StartPos - 1] == '-') Mul = -1;
  for (uint8_t i = StartPos; i <= EndPos; i++) {
    *Nummer += (Text[i] - 48) * round(pow(10, Len)) * Mul;  // Berechnen
    Len -= 1;
  }
  return EndPos + 1;
}

Danke für die Antworten, aber die passen nicht so richtig.
Das Programm an sich scheint ja zu klappen, ich bekomme ein Array mit den 8 float-Werten die der MEGA sendet.
Mein Problem ist dass es nicht mehr geht wenn ich dies als Funktion aufrufe oder in der loop-Schleife noch was anderes passiert. Und mein Sketch sollte irgendwann ja noch ein paar andere Dinge tun.

Wo ist denn dein Sketch mit dem nicht funktionierenden Funktionsaufruf?

Wenn deine Fragestellung nicht dem Problem entspricht, bei dem du Hilfe bekommen möchtest, dann ist es zwangsläufig so, dass die Antworten nicht passen können.

...ich schaffe es aber nicht die einzelnen Werten zu trennen und am besten in einem Array mit X Elementen zu speichern...

Von einem Funktionsaufruf war nie die Rede und der Sketch dazu fehlt auch noch.