Go Down

Topic: Arduino schreibt nur corrupte Files auf SD-Karte (Read 3875 times) previous topic - next topic

Dshing

Hallo,

ich will gerne Daten auf eine SD-Karte schreiben.
Die SD-Karte ist im Slot für einen TouchTFT.

Ich hab es mit der tinyFAT.h von rinkydink versucht und mit der standard SD.h

Bei beiden funktioniert das Lesen von Dateien, die via PC auf die Karte kamen einwandfrei. Auch Dateien erstellen und öffnen und schließen geht wunderbar.

Aber sobald ich was in eine Datei schreibe kann die Datei vom PC danach nicht mehr geöffnet werden und der Arduino erkennt zwar die Datei,  kann aber nichts auslesen, weil es leer ist. Die erstellten Dateien sind jedoch genau so groß wie der Inhalt, der eigentlich in ihnen stehen sollte.

Ich habe es auch schon mit den exakten Beispielcodes aus den libs versucht und dort nur das "Serial" in "Serial1" geändert, sowie bei dem SD.h Beispielcode den CS PIN. Beide Beispielcodes läuft durch und geben keine Fehlermeldung aus. Die Dateien sind nach dem Durchlauf da und belegen Speicher, aber sind nicht lesbar.

Könnt ihr mir Tipps geben, was ich noch versuchen kann? Ich hab keine Idee woran das liegen könnte.

sschultewolter

Files nicht geschlossen sondern direkt rausgezogen?
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Dshing

Hallo,

also schließen tue ich (der Arduino) den File.

Der Code in Kurzform:
WiIe gesagt, sonst verhalten sich auch die Beispiel Sketche genau so.
 
Code: [Select]

    file.create("BIG.TXT");
    file.openFile("BIG.TXT", FILEMODE_TEXT_WRITE);
    file.writeLn("Hallo");
    file.closeFile();


Ich hab auch schon versucht direkt im Anschluss nach dem Schreiben wieder zu lesen,

Ich hab auch schon SPI Frequenz auf niedrigste gestellt.

Serenifly


Dshing

Hab ich grade ausprobiert, genau das gleiche :(

Ich hab auch alle Leitungen durch geklingelt und keine Probleme Entdeckt.


jurs

Code: [Select]

    file.writeLn("Hallo");

Welche SD-Library verwendest Du, in der diese Zeile fehlerfrei kompiliert werden kann?
Diese Zeile kann mit der Arduino SD library nicht kompiliert werden.

Auch die Zeile
Code: [Select]
file.create("BIG.TXT");
sieht mir nicht ganz astrein aus.

Kompletter Code des Test-Programms?

Hat die verwendete SD-Karte überhaupt eine FAT-Formatierung?

Scherheinz

#6
Aug 20, 2015, 03:24 pm Last Edit: Aug 20, 2015, 03:25 pm by Scherheinz
Welche SD-Library verwendest Du, in der diese Zeile fehlerfrei kompiliert werden kann?
Diese Zeile kann mit der Arduino SD library nicht kompiliert werden.
Mit der tinyFAT.h soll es gehen, in Zeile 117 steht es mal so drin.

Code: [Select]
uint16_t writeLn(char *st);
Hier könnte ihre Werbung stehen

jurs

Mit der tinyFAT.h soll es gehen
Geht es noch mickeriger:
> tinyFAT: The library supports FAT16 formatted SD cards up to 2GB in size.

Gibt es im Handel überhaupt noch 2 GB SD-Karten zu kaufen?

Und dann muß man bei der Library auch noch aufpassen, dass sie mit FAT16 und nicht mit FAT32 formatiert wird, damit diese kastrierte Library mit der Karte funktioniert.

Ohne Not würde ich mir so ein Downgrade von der zur Arduino-IDE mitgelieferten SD Library zur tinyFAT Library bestimmt nicht antun wollen.

Serenifly

Quote
Gibt es im Handel überhaupt noch 2 GB SD-Karten zu kaufen?
Gibt es auf eBay massig

Er hat die Entwicklung wegen der angeblichen schwierigen Verfügbarkeit der Karten eingestellt.

michael_x

Das größte Problem der Standard SD library sind die 2 * 512B RAM Puffer.
Der andere Kram (komplexe Pfade) ist selten erforderlich im Arduino-Bereich, denke ich.

Aus meinem Datenlogger Projekt erinnere ich mich an das Problem, was passiert wenn die Karte mal draussen war und danach wieder verfügbar, evtl. gar ein Schreibversuch fehlgeschlagen, ohne dass der Arduino-Datenlogger resettet werden sollte.
Das hat früher (1.0) die Standard-Library nicht geschafft ohne einen Patch. (Ob die Karte da ist, wird nur bei open() entdeckt. Es fehlte das Gegenstück zu SD.begin(); Und so Zeug, denke ich. )

Das sollte man bei der tinyFAT auch prüfen...

2GB micro SDHC gibts tatäschlich noch. Class 10 ist ja schön und gut, ob sie tatsächlich noch SPI können, ist die andere Frage, bei der freundliche Chinesen-Händler in der Regel überfragt sind...


Dshing

Ja die befehle oben sind aus der tinyFAT.

Das SD.h Pendant sieht dann in Kurzform so aus.


SD.open("test.txt", FILE_WRITE);
    myFile = SD.open("neu.txt", FILE_WRITE);
    myFile.println("Blablabla...dadada");
    myFile.close();

Doc_Arduino

#11
Aug 20, 2015, 06:25 pm Last Edit: Aug 20, 2015, 06:29 pm by Doc_Arduino
Hallo,

2GB SDHC sollten funktionieren. Hatte mit dem original Arduino WLAN Shield eine 2GB micro Karte probiert. Hatte funktioniert.

Für das Karten Init Problem gibts eine kleine Korrektur. Dazu muß man die SD.cpp ändern ab Zeile 335. Die komplette Funktion sieht dann so aus.
Code: [Select]

boolean SDClass::begin(uint8_t csPin) {
  /*
    Performs the initialisation required by the sdfatlib library.

    Return true if initialization succeeds, false otherwise.

   Erster Block ergänzt, root wird geschlossen falls offen, damit kann jederzeit erneut initialisiert werden, zum Bsp. nach Kartenwechsel    
   */
   if (root.isOpen()) root.close();      // allows repeated calls
   return card.init(SPI_HALF_SPEED, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);
}


Für ernsthafte SD Karten Nutzung sollte man aber die modernere SdFat von Greiman verwenden.
https://github.com/greiman/SdFat
Auch wenn einem die Möglichkeiten damit erstmal erschlagen.

Wegen Deinem Code. 2x SD.open macht keinen Sinn. Ich glaube auch der erste Befehl so wie er da steht, erst das File löscht und neu erzeugt. Dir fehlt außerdem noch ein  SD.begin
Und wie ist myFile definiert usw.?
Du mußt schon den kompletten Code zeigen, sonst wird das nichts.

Guck Dir mal die Bsp. der SD Lib nochmal genauer an.


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Dshing

Hallo,

ja die erste Zeile sollte eigentlich gelöscht werden, hab ich wieder nicht aufgepasst und die Taste nicht voll durchgedrückt XD

Also der ganze SD.h Code sieht so aus (wie gesagt nicht wirklich was geändert):

Code: [Select]
/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial1.begin(9600);
  while (!Serial1) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial1.print("Initializing SD card...");

  if (!SD.begin(53)) {
    Serial1.println("initialization failed!");
    return;
  }
  Serial1.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial1.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial1.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial1.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial1.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial1.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial1.println("error opening test.txt");
  }
}
void loop()
{
  // nothing happens after setup
}



Ich werde mir mal die SdFat anschauen, vielleicht klappt es ja damit ;)

jurs

Code: [Select]

if (!SD.begin(53))

Der Chip-Select des SD-Moduls an Pin-53 ist sicher?

Abgesichert durch das Datenblatt und den Schaltplan?

Dshing


Go Up