ich habe da ein Problem, das ich gedanklich nicht auf die Reihe kriege.
Folgender Sachverhalt:
ich möchte, nicht immer, aber durch Menue auswählbar, Daten auf eine SD-Karte schreiben.
Das funktioniert auch alles ganz gut.
Aber: wenn ich die Karte im laufende Betrieb rausnehme, dann merkt der Arduino das nicht.
Wie kann ich prüfen, ob eine SD-Karte präsent ist?
Wenn ich SD.begin() nochmal ausführe bekomme ich einen Fehler, auch wenn die Karte steckt. Auch SD.exists hilft mir nicht weiter, weil diese Funktion ja nach einem Datei- oder Directorynamen verlangt.
Ich bräuchte einen Befehl der mir mitteilt, ob eine Karte steckt oder nicht.
Ansonsten solltest Du die Low-Level-Routinen verwenden, dort kannst Du direkt Kommandos an die SD-Karte schicken und CMD0 wäre dafür ein guter Kandidat.
Der SD-Slot hat 2 Kontakte: der erste kontrolliert ob der Schreibschutz (mechanischer Schieber auf der SD-Karte) gesetzt ist und der zweite ob eine Karte eingelegt ist. Kontrollier mal die Pins die am Slot nicht für den Datentransfer bzw Spannungsversorgung vorhanden sind.
Du solltest die Datei nach jedem Schreiben schliessen, wenn du nur von Zeit zu Zeit schreibst und zwischendurch eventuell die Karte rausnimmst.
Beim SD.open("MYFILE.TXT", FILE_WRITE); solltest du einen Fehler kriegen, wenn keine Karte drin ist.
Danach SD.begin() jede Minute (oder häufiger, nach Geschmack) wiederholen, bis die Karte wieder drin ist.
Falls erforderlich, kann ich heute abend mal wühlen, was ich brauchte, damit SD.begin() nachträglich / mehrfach geht. Ich denke da war was ...
Beinahe. cardCommand() ist eine Methode der Klasse Sd2Card. Du müsstest also die SD-Klasse umgehen und nur noch das Low-Level-API verwenden.
tut mir leid, aber das ist mir zu hoch (oder besser zu tief, weil Low-Level! :))
was, bitteschön, ist eine Low-Level-API???
Nein, laß stecken, das geht einfach über meinen Horizont. Ich probiert heute abend mal das mit dem "SD.exists("/");" aus, ich melde mich wieder.
@michael_X: die Datei wird jedes mal geschlossen, klar.
Aber du hast recht, ich fange den Fehler des SD.open nicht ab... mmmh.
vielleicht reicht das ja schon.
Erstmal vielen Dank an alle, Ihr habt mir sehr weitergeholfen!
SD.exists("/") liefert immer 0. Aus wenn ich anstelle von "/" andere, aus DOS bekannte Verzeichniszeichen versuche: "*", "?", "\", ".", ".." etc.
auch wenn ich versuche die Fehler von SD.open auszuwerten passiert immer das gleiche:
wenn ich die Karte nach SD.begin rausziehe, dann kommt kein Fehler.
Und mit CMD0 kann ich leider nichts anfangen.
hat vielleicht noch einer eine Idee, wie ich das vorhandensein einer SD-Karte nach SD.begin abfragen kann? @Uwe: die entsprechenden Pins sind auf meinem Breakoutboard nicht auf die Stiftleiste geführt. HW scheidet also leider aus. klar könnte ich noch ein Drähtchen anlöten, aber das muß doch auch mit SW möglich sein!
Ratschläge bitte verständlich halten. Ich habe zwar ein gutes Systemverständnis, bin aber nicht so der C-Crack.
guntherb:
Aber: wenn ich die Karte im laufende Betrieb rausnehme, dann merkt der Arduino das nicht.
Wie kann ich prüfen, ob eine SD-Karte präsent ist?
Wenn ich SD.begin() nochmal ausführe bekomme ich einen Fehler, auch wenn die Karte steckt. Auch SD.exists hilft mir nicht weiter, weil diese Funktion ja nach einem Datei- oder Directorynamen verlangt.
Ich bräuchte einen Befehl der mir mitteilt, ob eine Karte steckt oder nicht.
Richtig, jurs. Danke.
" Da war was ... " Schwache Erinnerungen sind nur unwesentlich besser als gar keine.
boolean SDClass::begin(uint8_t csPin) {
/*
Performs the initialisation required by the sdfatlib library.
Return true if initialization succeeds, false otherwise.
*/
if (root.isOpen()) root.close(); // allows repeated calls
return card.init(SPI_HALF_SPEED, csPin) &&
volume.init(card) &&
root.openRoot(volume);
}
Ich habe auch noch eine Funktion zugefügt, die den Volume-Namen der Karte liefert, daher war mir nur in Erinnerung, dass bei jedem IDE-Upgrade aufgepasst werden muss, dass nicht die original SD Library verwendet wird. Ausserdem ist es manchmal hilfreich zu wissen, ob card.init() oder volume.init() fehlschlägt...