Pages: [1]   Go Down
Author Topic: Verständnisproblem Schreiben auf eine SD-Karte (gelöst)  (Read 777 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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
« Last Edit: January 14, 2013, 03:16:51 am by Chaos_Lord » Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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/.
Logged

Check out my experiments http://blog.blinkenlight.net

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Udo,

ok.. das funktioniert erstmal super smiley-grin

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
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So ok,

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

ich habe folgendes Konstruct:
Code:
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:
  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?
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Check out my experiments http://blog.blinkenlight.net

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad Das ist ja mein Problem

Steve
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Und mit was hast Du geschaut? Einem Hex Dump Tool oder einem Texteditor?
Logged

Check out my experiments http://blog.blinkenlight.net

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

TexEdit als Text-Tool, HexEdit als Hex-Editor smiley-sad
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  int test = 12;
  File mydummyFile = SD.open("system.log", FILE_WRITE);
  mydummyFile.print(test);
  mydummyFile.close();
erhalte ich wenigstens eine 12

stattdessen liefert

Code:
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  smiley-cry

Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin )

Steve
Logged

Pages: [1]   Go Up
Jump to: