Probleme mit Buffer und strcpy

Der Code tut noch nicht so wie er soll. Inzwischen bin ich auf ein sehr seltsames Phänomen gestossen. Ich möchte noch Timestamps an die SMS hängen. Dafür habe ich eine RTC ans Uno gehängt (via I2C). Meine neue Funkion printTime funktioniert einwandfrei wenn ich sie im Loop aufrufe. Doch wenn ich sie vor dem SMS senden aufrufe nicht.

Neue Funktion:

char printTime() {
  clock.getTime();
  char buff [30];
  sprintf(buff, "%d:%d:%d, %d.%d.%d", clock.hour, clock.minute, clock.second, clock.dayOfMonth, clock.month, clock.year);
  Serial.println(buff);
  return buff;
}

hier wird sie aufgerufen, doch bei TimeBuf kommt nichts..

    if (digitalRead(AlarmPin) == HIGH)
    {
      digitalWrite(AlarmLed, HIGH);
      Alarm = true;
      char buf[70];
      char TimeBuf = printTime();
      delay(100);
      Serial.println(F("TimeBuf:"));
      Serial.println(TimeBuf);
      sprintf(buf, "WATER ALARM! \n Tuefwiesenstrasse 4 \n Immediate Action required! \n %s", TimeBuf);
      (SIM7600.sendSMS(number, buf));
    }
    startMillis = currentMillis;

wenn ich diese Zeilen, also 1:1 wie im Code in den Loop tue, gehts. Wie dat?

  char TimeBuf = printTime();
  char buf[70];
  sprintf(buf, "WATER ALARM! \n Tuefwiesenstrasse 4 \n Immediate Action required! \n %s", TimeBuf);
  Serial.println(F("buf:"));
  Serial.println(buf);

Du kannst kein lokales char-Array zurückgeben. Der Rückgabewert char ist nur 1 Zeichen, das Array wäre char *, aber das geht so nicht.
Du musst entweder den Puffer mit übergeben (besser) oder mit einem globalen Puffer arbeiten.

Gruß Tommy

Oder den Puffer als static char buf[30]; deklarieren.

Der Rückgabewert der Funktion muss ein
char* oder const char* sein, wie @Tommy56 schon geschrieben hat.

mein Compiler schimpft nur :see_no_evil:
"storage class specifiers invalid in parameter declarations"

So:

char* printTime() {
  clock.getTime();
  static char buff [30];
  sprintf(buff, "%d:%d:%d, %d.%d.%d", clock.hour, 
     clock.minute, clock.second, clock.dayOfMonth, 
     clock.month, clock.year);
  return buff;
}

Aufruf
char* t = printTime();
Serial.println(t);,

1 Like

Danke vielmals @michael_x!

Was geht (nicht) ???

Hallo Leute
Ich musste das Projekt leider aus privaten Gründen sistieren. Nun möche ich gerne fortfahren. Ein gröberes Problem (nebst anderen) sehe ich aktuell beim Löschen der SMSen. Wenn ich SMS an das Modul sende, werden die Nachrichten oft bei ersten Mal nicht gelöscht. Entsprechend kommt dann "Couldn't delete, try again" (siehe unten) im Serial Monitor.

      while (1)
      {
        boolean deleteSMSDone = SIM7600.deleteSMS(slot);
        if (deleteSMSDone == true)
        {
          Serial.println(F("OK!"));
          break;
        }
        else
        {
          Serial.println(F("Couldn't delete, try again."));
        }
      }

Zudem sehe ich eine grosse Gefahr darin, dass dies in einer while(1) geschieht. Denn so kann sich das Programm aufhängen, wenn mit slot was nicht stimmt. Ich überlege, ob ich nach z.B.10 Cycles abbrechen soll und per AT command die SMSen löschen soll.

sorry, ich wollte dich nicht ignorieren. werde morgen auflisten, was noch nicht passt!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.