Problem: struct verliert Inhalte

Hallo Zusammen

Beschreibung:
Ich arbeite gerade an einem Projekt, bei dem es recht viel um Datenübertragung geht. Ich würde hier gerne ein struct für die Variablen der Schnittstelle benutzen. Zu der seriellen Schnittstelle soll noch eine I2C - Schnittstelle, zu einem zweiten Arduino Nano, hinzugefügt werden soll.

Problem:
In der ‘while’ Schleife werden zunächst die char sortiert und zu mehreren Strings zusammengeflickt, um diese in dem ‘data_array’ aus dem ‘struct’ speichern zu können. Der Teil funktioniert, denke ich auch schon ganz gut.

In dem Ausschnitt von dem SerialMonitor, sieht man was passiert, wenn ich “10,20,30,40,” in die console eingebe.
Für den aktuellen Programmzyklus werden die Daten in das Array übergeben, aber schon in dem darauf volgendem Programmzyklus sind die Daten nicht mehr abrufbar.

Hier noch der code, welchen ich für die Fehlersuche zuletzt verwendet habe.

/*
 Name:    VD30_Master_Sketch.ino
 Created: 5/29/2019 10:39:46 AM
 Author:  
 Version: 3.0
*/



#include <SoftwareSerial.h>
#include <Wire.h>
#include <HX711.h>
#define PPM 2

struct data
{
  char data_read;
  String data_write;
  String data_as_string_in;
  String data_as_string_out;
  int data_array[5] = {0,0,0,0,0};
};

int i = 0;
int servotime[8] = { 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200 };
int startintervall = 0;
unsigned long time = millis();


void setup() {
  pinMode(PPM, OUTPUT);
  digitalWrite(PPM, HIGH);

  Serial.begin(115200);
  Serial.println("------ Hello, im redy for rumble -------");
  Serial.println("------- Baudrate Serial: 115200 --------");
  Serial.println("");

  Wire.begin();
}

void loop() {
//---------------------------------------------------------------- Serial Poert in ---
// --- read
  data d_serial;
  data d_wire;

  i = 0;
  d_serial.data_as_string_in = "";
  while (Serial.available() > 0)
  {
                                                Serial.println("whil available");
    d_serial.data_read = Serial.read();
    if (d_serial.data_read == ',')
    {
      d_serial.data_as_string_in = "";
      i += 1;
    }
    else
    {
      d_serial.data_as_string_in += d_serial.data_read;
      d_serial.data_array[i] = d_serial.data_as_string_in.toInt();
                                              Serial.print("d_serial.data_array["); Serial.print(i); Serial.print("] = "); Serial.println(d_serial.data_array[i]);
    }

  } 
    Serial.print("d_serial.data_array 0: "); Serial.println(d_serial.data_array[0]);
    Serial.print("d_serial.data_array 1: "); Serial.println(d_serial.data_array[1]);
    Serial.print("d_serial.data_array 2: "); Serial.println(d_serial.data_array[2]);
    Serial.print("d_serial.data_array 3: "); Serial.println(d_serial.data_array[3]);
}

Ausgabe über den Seriallen Monitor:

d_serial.data_array 0: 0
d_serial.data_array 1: 0
d_serial.data_array 2: 0
d_serial.data_array 3: 0
d_serial.data_array 0: 0
d_serial.data_array 1: 0
d_serial.data_array 2: 0
d_serial.data_array 3: 0
whil available
d_serial.data_array[0] = 1
whil available
d_serial.data_array[0] = 10
whil available
whil available
d_serial.data_array[1] = 2
whil available
d_serial.data_array[1] = 20
whil available
whil available
d_serial.data_array[2] = 3
whil available
d_serial.data_array[2] = 30
whil available
whil available
d_serial.data_array[3] = 4
whil available
d_serial.data_array[3] = 40
d_serial.data_array 0: 10           <---So sollte es bleiben, da Serial.available <= 0
d_serial.data_array 1: 20           <---So sollte es bleiben, da Serial.available <= 0
d_serial.data_array 2: 30           <---So sollte es bleiben, da Serial.available <= 0
d_serial.data_array 3: 40           <---So sollte es bleiben, da Serial.available <= 0
d_serial.data_array 0: 0            <---Fehler: Wo sind die daten hin?
d_serial.data_array 1: 0            <---Fehler: Wo sind die daten hin?
d_serial.data_array 2: 0            <---Fehler: Wo sind die daten hin?
d_serial.data_array 3: 0            <---Fehler: Wo sind die daten hin?
d_serial.data_array 0: 0
d_serial.data_array 1: 0
d_serial.data_array 2: 0
d_serial.data_array 3: 0
d_serial.data_array 0: 0
d_serial.data_array 1: 0
d_serial.data_array 2: 0
d_serial.data_array 3: 0
d_serial.data_array 0: 0
d_serial.data_array 1: 0
d_serial.data_array 2: 0
d_serial.data_array 3: 0
void loop() {

//---------------------------------------------------------------- Serial Poert in ---
// --- read
  data d_serial;
  data d_wire;

Lokal definierte Daten/Variablen/Instanzen verfallen üblicherweise beim verlassen des Geltungsbereiches.

Also alles mit der C++ Dokumentation konform.

Ohh, ja das hat auch schon weiter geholfen :-).

Hatte weiter unten im Sketch ein struct mit wire verwendet, welches zufällig funktioniert hatte. Das hat mich etwas verwirrt gehabt.

Nun verstehe ich das ganze wieder ein Stückchen besser, vielen vielen dank.

struct data
{
  char data_read;
  String data_write;
  String data_as_string_in;
  String data_as_string_out;
  int data_array[5] = {0,0,0,0,0};
};

Ich glaube nicht, dass es eine gute Idee ist, String Objekte in einem struct zu verwenden.

ElEspanol:
Ich glaube nicht, dass es eine gute Idee ist, String Objekte in einem struct zu verwenden.

Es ist keine gute Idee Strings zu benutzen*, struct macht da keinen Unterschied.

*auf ‘normalen’ Arduinos wie UNO/Mini/Mico/Nano/Leonardo

Es ist keine gute Idee Strings zu benutzen*, struct macht da keinen Unterschied.

Wollte ich auch schon sagen, habs mir aber verkniffen.
Mit anderen Worten... aber sinngemäß ... JA!