Stringlänge ist 0, wieso?


int alt1 = 0;
int neu1 = 0;
unsigned long  start1 = millis();
unsigned long  stop1 = 0;
unsigned long  dif1 = 500;
unsigned long  Zahl1 = 0;

int alt2 = 0;
int neu2 = 0;
unsigned long  start2 = millis();
unsigned long  stop2 = 0;
unsigned long  dif2 = 500;
unsigned long  Zahl2 = 0;
String str = "";
//==============================

void setup()
{
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  Serial.begin(9600);
}
//=================================

void loop()
{
  neu1 = digitalRead(3);
  neu2 = digitalRead(4);
  //===========================

  if (neu1 < alt1)      // FALLING
  { stop1 = millis();
    dif1 = stop1 - start1 ;
    start1 = millis();
    //str = String(millis()) + " - " + String(dif1) + " - " + String(dif2);
    Ausgabe2();
    //Serial.println(str);
    //for (int i = 0; i < str.length(); i++)
    //{
    //Serial.print(str.charAt(i));
    //}
    //Serial.println(millis());
    //Serial.println(dif1);
    //Serial.println(dif2);
    //Serial.println();
  }
  else if ((millis() - start1) > 1800500)
  { dif1 = 1800500;
    start1 = millis();

  }
  alt1 = neu1;

  //===============================

  if (neu2 < alt2)      // FALLING
  { stop2 = millis();
    dif2 = stop2 - start2 ;
    start2 = millis();
    //str = String(millis()) + " - " + String(dif1) + " - " + String(dif2);
    Ausgabe2();
    //Serial.println(str);
    //for (int i = 0; i < str.length(); i++)
    //{
    // Serial.print(str.charAt(i));
    //}
    //Serial.println(millis());
    //Serial.println(dif1);
    //Serial.println(dif2);
    //Serial.println();
  }
  else if ((millis() - start2) > 1800500)
  { dif2 = 1800500;
    start2 = millis();
  }
  alt2 = neu2;
}

//================================
void Ausgabe()
{
  Serial.print(millis());
  Serial.print(" , ");
  Serial.print(dif1);
  Serial.print(" , ");
  Serial.println(dif2);
}
void Ausgabe2()
{
  Serial.println("OPW SO.DAT");
  str = String(millis());
  Aus();
  str = " , ";
  Aus();
  str = String(dif1);
  Aus();
  str = " , ";
  Aus();
  str = String(dif2);
  Aus();
  Serial.println("CLF SO.DAT");
}
void Aus()
{
  Serial.println(str.length());
  for (int i = 0; i < str.length(); i++)
  {
    char a = (str.charAt(i));
    Serial.println ("WRF 0001");
    Serial.print(a);
  }
}

Guten Tag,
steh mal wieder aufm Schlauch.
Aus der "Ausgabe2()" wird die "Aus()" aufgerufen, in der verschiedene Daten zeichenweise an einen USB-Stick (via Vdrive2) übergeben werden sollen.
Da das nicht passiert, hab ich mal die Länge der String-Variablen mit ausgedruckt .
Was beweist, daß die Routine aufgerufen wird, aber dank der Länge 0 nicht ausgeführt wird. (str iat als String deklariert).
Wo muß ich noch suchen?

Gruß
Helle`

serieller Monitor:
OPW SO.DAT
0
0
0
0
0
CLF SO.DAT

Kannst Du bitte Deinen Code in codetags hier einfügen? Keine Bildschirmfotos!

Aus den Fragmenten kann keiner etwas herauslesen. Gib uns bitte einen compilierfähigen Code.

Gruß Tommy

Ok, habs geändert.

Das wird nichts.
Auf was für einem Controller soll denn das laufen?

Ein Attiny45,

String auf einem AtTiny grenzt an Selbstmord. :wink:

Gruß Tommy

Dann verabaschiede Dich von String und bau charArray.

Das soll ein hinten angesetzt werden oder soll die Zeichenkette genau so zugewiesen werden?

Das tuts auf allen Arduinos.

Aber nicht das Serial.print() das kennt der Tiny nicht.

Na ja, in "Ausgabe()" hab ich die Daten auf den SerMonitor geschrieben , und da tut Serial.Print()

Wundert mich etwas, denn der Tiny hat gar keine UART.
Welche Harwaredefinition verwendest du denn?

Ohne String Objekte und besonders ohne die globale Variable
String str;
wird alles viel einfacher. Entweder dein Problem ist dann weg, oder man kann dir helfen.

SPI - Signal invertiert

Ich halte es für überflüssig, millis() nochmals aufzurufen.
Eigentlich gibt es ja einen String()-Konstruktor für unsigned long (jedenfalls lt. Referenz) - da würde ich mal das versuchen:

    str = String(start1) + " - " + String(dif1) + " - " + String(dif2);

Über Funktionsaufrufe zur Initialisierung von Variablen vor dem setup() möchte ich nicht philosophieren.

unsigned long  start1 = millis();
unsigned long  start2 = millis();

Ein Compiler-Warnung kannst Du DIr ersparen, wenn der Schleifenzähler nicht vom Typ int ist:

  for (size_t i = 0; i < str.length(); i++)

Da ich die Tinys nicht in meiner IDE habe: Wenn der Code ähnlich fett wird wie beim Uno würde es den Speicher vom 45 schon sprengen

Globale Variablen verwenden 262 Bytes (12%) des dynamischen Speichers, 1786 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Aua.

Gruß Tommy

Ja, tut mir auch weh - würde ich immer mit C-Strings/Char-Arrays machen; wenn der Controller es hergibt mit snprintf, das ist ausreichend bequem.
Stammt aber aus dem Sketch aus #1 - nur halt nicht mit millis() (auskommentierte Zeile vor Ausgabe2()).

Bin noch nicht weiter.
Aber zunächst eine Zwischenfrage:

strang ist ein String,
sizeof(strang) liefert mir die Länge 6, also von "strang",
ich will aber nicht die Länge vom Namen der Variablen, sondern von deren momentanem Inhalt
Wie geht das?
ic

Ist die Länge immer noch 6, wenn Du strang überall in Deinem Sketch umbenennst in strangabc?

Man kann nicht die Länge eines Variablennamens ermitteln.
Du irrst!

Wenn das ein String ist, dann strang.length();

@WNO158 : muß ich probieren
@combie: hatte ich doch schon ganz am Anfang, lieferte die Länge 0