Go Down

Topic: Verständnisproblem Schreiben auf eine SD-Karte (gelöst) (Read 1 time) previous topic - next topic

Chaos_Lord

Jan 12, 2013, 02:30 am Last Edit: Jan 14, 2013, 09:16 am by Chaos_Lord Reason: 1
Hallo zusammen,

ich habe hier ein kleines Projekt, wo ich über ein Ethernet-Shield auf eine SD-karte schreibe. Karte wird problemlos initialisiert, Dateien erstellt, und auch der TestText den ich reinschreibe in die Datei geschrieben. Nun versuche ich, diesen Text wieder auszulesen und dann in eine Variable zu schreiben. Und gneau hier hapert es.

Wenn ich über die folgen Prozedur

Code: [Select]
boolean writeTextToFile(const char* filename, char* inhalt)
{
 int bytesWritten = 0;
 
 myFile = SD.open(filename, FILE_WRITE);
 bytesWritten = myFile.write(inhalt);
 myFile.close();
 
 if (bytesWritten > 0) { return true; } else { return false; }
}


mittels
writeTextToFile("dummy.txt","Dummy-Zeile");
etwas schreiben lasse, dann steht in der Datei auch die gewünschte Zeile (habe die Karte über einen SD-Reader an meinem PC ausgelesen.

Die read() Anweisung liest, soweit ich das richtig verstanden habe byte fuer byte ein, daher versuche ich mittels

Code: [Select]
char* readFromFile(const char* filename)
{

 int pos=0;
 
  myFile = SD.open(filename);
  if (myFile) {
     // read from the file until there's nothing else in it:
     while (myFile.available() && pos < (BUFSIZE-1)) {
    buffer[pos++] = myFile.read();
     }
     myFile.close();
     buffer[pos]=0; // EndeKennung
     return (buffer);
 }
 return 0; // Fehler: Datei nicht gefunden
}

die Datei wieder auszulesen.
Lasse ich das Erhaltene in meinem LCD Anzeigen steht dort tatsächlich die vorher geschrieben Zeile.
lcd.print(readFromFile("testdat.txt"));
Wenn ich aber diese Zeile teste
if (readFromFile("testdat.txt") == "Dummy-Zeile")
erhalte ich ein false.
Warum?

Danke schon mal für alle Hinweise

Steve

Udo Klein

Weil Du die String POINTER und nicht die String INHALTE vergleichst. Die zwei Strings stehen an verschiedenen Stellen im Speicher, deshalb kommt da immer false raus. Deshalb nimmt man dafür strcmp http://www.cplusplus.com/reference/cstring/strcmp/.
Check out my experiments http://blog.blinkenlight.net

Chaos_Lord

Hallo Udo,

ok.. das funktioniert erstmal super :D

richtig verstehen tue ich es aber immer noch nicht, warum sind denn das andere mal das Zeiger? Wenn ich die übergebene Ausgabe in eine Variable schreibe dann habe ich das gleich Problem... Dann sollte es doch kein Zeiger mehr sein, oder habe ich das grundsätzlich was flsch verstanden?

Steve

Chaos_Lord

So ok,

nun habe ich mich mit dem Problem mal weiter auseinander gesetzt und bin über ein neues gestolpert.

ich habe folgendes Konstruct:
Code: [Select]
struct datum {
      const char*  Wochentag;
      int  Tag;
      int  Monat;
      int  Jahr;
      int  Stunde;
      int  Minute;
      int  Sekunde;
};
struct datum lokalesDatum;


In diesem wird von einem npt Server das aktuelle Datum hinterlegt. Soweit kei Problem funktioniert wurnderbar.
Nun möchte ich auf die SD Karte ein Log mit dem aktuellem Datum schreiben.

Code: [Select]
  myFile = SD.open("system.log", FILE_WRITE);
  myFile.write(lokalesDatum.Stunde);
  myFile.close();


wird zwar so übernommen, aber im Log steht nix drin. Ich denke mal das das hier genau das gleiche Problem ist, das das wieder Zeiger sind oder?

Udo Klein

Bist Du Dir sicher, daß in Deinem Log wirklich nichts drin steht? Oder könnte es auch so sein, daß Du den Inhalt nur nicht siehst? D.h. hast Du schon mal mit einem Hex Monitor nachgeschaut? Auf was ich raus will: es sieht aus als würdest Du die Bytes in die Datei schreiben beim Lesen aber Text erwarten.
Check out my experiments http://blog.blinkenlight.net

Chaos_Lord

Hallo,

ja bin ich, habe die Karte in einen Leser gepackt und nachgeschaut. da steht alles drin, nur eben nicht die Sachen, die er aus diesem struct schreiben soll :( Das ist ja mein Problem

Steve

Udo Klein

Und mit was hast Du geschaut? Einem Hex Dump Tool oder einem Texteditor?
Check out my experiments http://blog.blinkenlight.net

Chaos_Lord

TexEdit als Text-Tool, HexEdit als Hex-Editor :(

Chaos_Lord

So ein paar Stunden später und immer noch nicht weiter, naja fast...

Ok das Problem ist wie ich mitlerweile verstehe wohl nicht nur die Übergabe aus dem Struct sondern zusätzlich das schreiben von Integer Werten in eine Datei.

Ich habe mal stumpf versucht einen Integer über die aufgefuehrte Writefunktion zu schreiben. Es kommt stehts als Wert in der Datei 0 heraus oder nix raus.
Nehme ich
Code: [Select]
  int test = 12;
  File mydummyFile = SD.open("system.log", FILE_WRITE);
  mydummyFile.print(test);
  mydummyFile.close();

erhalte ich wenigstens eine 12

stattdessen liefert

Code: [Select]
int test = lokalesDatum.Tag;

  File mydummyFile = SD.open("system.log", FILE_WRITE);

  mydummyFile.print(test);
  mydummyFile.close();

die bekannte 0... Daher denke ich das mein Problem wirklich in der Übergabe an das Objekt liegt aber ich sehe nicht wo  =(


Chaos_Lord

Hallo zusammen,

nachdem ich desert-fox meine Erfahrung mit dem Ethernet-Shield geschrieben habe, versinke ich nun mal knallrot im Boden... Beim Schreiben ist mir der Grund für meine Probleme klar geworden...

Das problem sitzt mal wieder zwischen Tastatur und Stuhl.....

Mein Problem, wie im anderen Post beschrieben, ist, das ich zunächst (warum auch immer) das netzwerk zum laufen bringen muß, bevor die SD-Funktionen laufen. Habe ich auch gemacht, dummerweise ist dadurch aber die Abfrage fuer den Zeitserver, der dann das Struc lokalesDatum befuellt hinter die SD-Initialisierung gerutscht.... Der rest ergibt sich dann natürlich automatisch

ES HAT DIE GANZE ZEIT FUNKTIONIERT  :smiley-roll-sweat: und er hat brav den Inhalt nämlich 0 reingeschrieben....
Was mir nich klar ist, warum aber die write Funktion nix geschrieben hat, aber das ist ein anderes Problem..

Daher danke an desert-fox für den indirekten Hinweis und vorallem an UWE der auch noch so komische Fragen mit absoluter Ruhe und gelassenheit beantwortet (das wollte ich hier mal loswerden :D )

Steve

Go Up