Hallo !
Ich hab eine Testanwendung für SD-Karte und mein ehem. Kollege hat die
Libs von Ulrich Radig verwendet.
Was die Lese-Routine einliest sollte erstmal unwesentl. sein.
Das Lesen geht und sieht wie folgt aus:
Jetzt hat sich herausgestellt, dass es sinnvoll wäre wenn man für den
Fehlerfall ein LOG-File rauschreibt.
Entsprechend hab ich die obige Routine wie folgt abgeändert:
usart_write_TM("\r\nxerror-File not found!!\r\n");
17
Blink_Err_nTimes(7);// Optische Anzeige
18
19
while(1)
20
{
21
}// while(1) End
22
}// else End
23
24
25
Clustervar=0;
26
Dir_Attrib=0;
27
Size=0;
28
}
Nur das ganze funktioniert nicht mehr. Selbst wenn ich die Zeile mit dem
eigentl. Befehl (fat_write_file...) rauslasse, will das Programm nicht
mehr richtig einlesen. Es wäre wichtig dass ich die Error-Strings im
File appenden kann !
Kann mir jemand sagen was hier nicht O.K. ist ?
Gruß U
Hallo !
Ich hab einen kleinen Fehler mit der usart gehabt. Ich hab jetzt die
usart-Ausgabe bei write_error rausgemacht und jetzt tut es halbwegs.
bei dem Befehl
1
fat_write_file(Clustervar,Error_String,0);
schreibt er mir nur die ersten drei Zeichen des Error_Strings.
Ich kann machen was ich will, es bleibt bei drei.
Wenn im Error String folgendes steht: Erste Zeile ...
dann erscheint Ers sonst nichts.
Kann mir jemand weiterhelfen warum er nicht den ganzen String
rausschreibt ?
Gruß U
> Selbst wenn ich die Zeile mit dem> eigentl. Befehl (fat_write_file...) rauslasse, will das Programm nicht> mehr richtig einlesen.
Der Unterschied ist dann
> usart_write(" Error-Meldung: %s ", Error_String);
Bist du sicher, dass du diese Funktion richtig verwendest? Ist der
String in Error_String Nullterminiert oder nicht? Die explizite Angabe
von CG lässt andere Schlüsse zu.
> Ich hab einen kleinen Fehler mit der usart gehabt. Ich hab jetzt die> usart-Ausgabe bei write_error rausgemacht und jetzt tut es halbwegs.> bei dem Befehl>> fat_write_file (Clustervar,Error_String,0);
Wurde der Fehler behoben (s.o.) oder nur nicht mehr aufgerufen?
http://www.mikrocontroller.net/attachment/36575/fat.c
1
//Schreiben eines 512Bytes Blocks von einem File
2
voidfat_write_file(
3
unsignedintcluster,//Angabe des Startclusters vom File
4
unsignedchar*buffer,//Workingbuffer
5
unsignedlongblockCount)//Angabe welcher Bock vom File gespeichert
6
//werden soll a 512 Bytes
d.h. du musst unsigned char Error_String[] mindestens mit 512
Feldelementen definiert haben. Hast du das?
Hallo Krapao !
Erstmal danke für deine Antwort !
Um es kurz zu sagen es funktioniert jetzt aber etwas seltsames ist
passiert !
Also die usart funktion spukt ja den String "Erste Zeile ...\r\n" aus.
Das wollte ich ja, um zu sehen ob der Error-String gefüllt ist.
-- Er ist --
Und jetzt kommt das seltsame. (Vielleicht habe ich auch etwas
überlesen):
Es standen ja wie ich sagte im Error.log-File immer die ersten drei
Buchstaben vom String - also Ers
Es hätte ja sein können, dass es noch vom letzten mal drin steht und er
gar nichts rausschreibt.
Also habe ich die Buchstaben Ers durch 1234567890 ersetzt.
Als ich meine schreibroutine aufrief kam folgendes zum vorschein:
Erste Zeil ( das sind genau die 10 Zeichen )
Jetzt hab ich das File mit 500 Leerzeichen aufgefüllt und jetzt schreibt
er schön hinein.
Ich dachte aber dass ich beim rausschreiben den "Buffer" rausschreibe -
egal was auf der SD-Karte steht, aber offensichtlich muss das File
gefüllt sein und wenns nur Leerzeichen sind. Nun, das ist nicht ganz so
schön und ich hab im Augenblick keine Erklärung dafür.
Gruß U
Ganz einfach, du legst ein File an die Größe steht im
Verzeichniseintrag. Du kannst jetzt Daten in den Block der Datei
schreiben wie du willst und die werden auch abgespeichert nur die Länge
im Verzeichniseintrag ändert sich natürlich nicht von selbst - das musst
du auch noch machen.
Sascha
Hallo Sascha !
Danke für die schnelle Antwort !
Ich hab meine Schaltung hier daheim nicht aufgebaut und komme erst
Montag wieder dazu, deshalb muss ich quasi das ganze jetzt "auswendig"
sagen.
Der ehem. Kollege hat sich die Verzeichniseinträge per usart ausgeben
lassen. Ich kanns nicht genau sagen aber ich vermute dass dann pro
Datei-Eintrag ein Verzeichniseintrag vorhanden sein müßte. Das sind aber
nur ein, zwei oder drei Hexzahlen pro Datei die "ausgespuckt" werden.
Wie sollte ich aber bei Ulrich Radigs Library den neuen Eintrag bzw. die
Länge des Files wieder auf SD zurückschreiben. Ich glaube, da gibts
keine Funktion dafür.
Folgende Funktionen werden von UR zur Verfügung gestellt:
Ich schreibe dann per fat_write_file. Der letzte parameter mit unsigned
long ist die Blockgröße von 512 Bytes. D.h. hier müßte eine 1 rein, oder
?
Fantastisch wäre es wenn man irgendwie eine append-Funktion hätte die
dann den Text immer hinten dran hängt, aber ich glaube das wird mit
diesen Funktionen nicht so ohne weiteres gehen.
Gruß U
U. B. schrieb:> ...> Ich schreibe dann per fat_write_file. Der letzte parameter mit unsigned> long ist die Blockgröße von 512 Bytes. D.h. hier müßte eine 1 rein, oder ?
ja
für das Ändern des Dateieintrags musst du dir was neues basteln!
Dazu könntest du als Grundgerüst die "fat_read_dir_ent" verwenden, der
einen bestimmten Verzeichniseintrag sucht. Die Nummer des Eintrags
deines Files kennt erst mal nur die Funktion "fat_search_file" - den
müsstest du dir also noch mit zurückgeben lassen. Den Teil in
"fat_read_dir_ent" in dem dann der Dateiname und die Größe ausgelesen
wird müsstest du durch das speichern der neuen Größe und das Schreiben
des Blocks auf die SD-Karte ersetzen. Das ganze funktionert natürlich
nur solange du keinen neuen Cluster brauchst! Die Lib dahingehend zu
erweitern macht sicherlich zu viel Arbeit, das nehmt Ihr besser eine
andere Lib die das schon eingebaut hat.
Sascha