Re: Absturz bei Dateien >10000 Byte auf SD-Card Kategorie: Programmierung Basic (von Max - 9.05.2014 20:21) | ||
Als Antwort auf Re: Absturz bei Dateien >10000 Byte auf SD-Card von Josef - 7.05.2014 9:39 | ||
| ||
> > > > Hallo, > > > > ich habe in meinem Projekt eine Protokolldatei in der verschiedene > > > > Aktionen dokumentiert werden. > > > > Aber leider stürzt mein Programm bei einer DateigröÃ?e von gröÃ?er 10 000 Byte > > > > beim Befehl SD_READ_FILE_STATUS ab. > > > > Unten habe ich ein kleines Testprogramm welches das Anfügen von Protokolldaten > > > > simuliert. > > > > GruÃ? Max > > > > > > > > > > > > Es wird die SD_Lib.cc aus der Demo â??Easy File Access with SD_Libâ?? verwendet. > > > > > > > > Dim X As Integer > > > > Dim Text(30) As Char > > > > > > > > Sub main() > > > > Dim res As Byte > > > > Text = "Text ;Text ;Text ;Text ;Text" > > > > res = SDC_Init(_fat) > > > > Do While True > > > > X++ > > > > Msg_WriteInt(X) > > > > Msg_WriteText(" ") > > > > ProtokollSpeichern() > > > > Msg_WriteChar(13) > > > > > > > > End While > > > > End Sub > > > > > > > > Sub ProtokollSpeichern() > > > > Dim res As Byte > > > > Dim bytes_written(1) As Word > > > > res = SDC_Init(_fat) > > > > > > > > Msg_WriteText("SD_READ_FILE_STATUS 1r") > > > > SD_READ_FILE_STATUS("protokol.csv") > > > > Msg_WriteText("SD_READ_FILE_STATUS 2r") > > > > Msg_WriteText(error_str ) > > > > Msg_WriteChar(13) > > > > > > > > SD_OPEN_FILE("protokol.csv") > > > > Msg_WriteText(error_str ) > > > > SD_SEEK(_attrib(0)) > > > > Msg_WriteText(error_str ) > > > > SD_WRITE_FILE(Text) > > > > Msg_WriteInt(res) > > > > SD_CLOSE_FILE() > > > > SD_SET_DATE_TIME("protokol.csv", Clock_GetVal(3) + 1, Clock_GetVal(4) + 1, _ > > > > Clock_GetVal(5) + 2000, Clock_GetVal(1), Clock_GetVal(2), Clock_GetVal(0)) > > > > End Sub > > > Hallo Max, > > > ein grundsätzliches GröÃ?enproblem kann ich ausschlieÃ?en, da ich gerade problemlos eine Logdatei > > > mit mehr als 300 kByte korrekt per AVR32 erstellt und auch lesen kann (Programm in Compact C). > > > Leider bin ich mit BASIC nicht besonders vertraut, um den Code beurteilen zu können, würde aber > > > die SD_SEEK - Parameter einer genaueren Prüfung unterziehen. > > > GruÃ? > > > Josef. > > > > Hallo Josef, > > ich weiÃ? was du meinst. Da fehlt ein Argument! > > Aber die Adresse des FILE Puffers wird in der SD_Lib.cc eingetragen. > > SD_SEEK ist ein Unterprogramm. > > Du könntest mir aber den Teil deines Programmes posten wo du Einträge zur Logdatei hinzufügst. > > Das würde mir sicher weiterhelfen. > > > > GruÃ? Max > Hallo Max, > folgende Routine wird je Programmstart nur einmal gestartet, die Logfile bleibt solange offen > und alle weiteren Schreibaktionen finden per SDC_FWrite(..) statt, > bis das Programm wieder beendet wird: > > byte QF; // Rückgabewert der Fileoperation > dword FIL_Attrib[4]; // FSTAT - Ergebnisablage > dword FIL_Size; // DateigröÃ?e > > SDC_Init(FAT_Buff); // Dateisystem initialisieren > // Logdatei zum Schreiben öffnen mit Zugriffszeitupdate > QF = SDC_FOpen (FIL_Buff, Filename, FA_READ | FA_WRITE | FA_OPEN_EXISTING); > if(QF!=0) > QF = SDC_FOpen (FIL_Buff, Filename, FA_READ | FA_WRITE | FA_CREATE_ALWAYS); > > // Datumsstring aufbauen > QF = SDC_FSetDateTime (Filename, DoM, mm, Year, Min, Std, Sek); > > QF = SDC_FStat (Filename, FIL_Attrib); > FIL_Size = FIL_Attrib[0]; > SDC_FSeek(FIL_Buff, FIL_Size); // Datei fortschreiben > > SDC_Datumseintrag(); // yy.mm.tt in Logfile.csv schreiben > SDC_Reihentitel(); // Reihenbeschriftung in die erste Zeile eingtragen > > GrüÃ?e > Josef. > Hallo, jetzt gehts. Ich hab jetzt das Ganze ohne die SD_Lib.cc gemacht. Wenns jemand brauchen kann, hier der Quelltext GruÃ? Max Dim Y As Integer Dim Text(40) As Char Dim _fat(SDC_FAT_BUF) As Byte Dim _fil(SDC_FILE_BUF) As Byte Dim _attrib(4) As ULong Sub main() Dim res As Byte Clock_SetTime(11,23,0,0) Clock_SetDate(7,5,14) res = SDC_Init(_fat) For Y = 0 To 2000 Text = "" Str_Printf(Text,"%d:%d:%d;Text ;Text ;Text ;Text ;Textrn", Clock_GetVal(2), Clock_GetVal(1), Clock_GetVal(0)) Msg_WriteInt(Y) Msg_WriteText(" Yr" ) ProtokollSpeichern() Msg_WriteChar(13) Next End Sub Sub ProtokollSpeichern() Dim res As Byte Dim Attrib0 As ULong Dim bytes_written(1) As Word res = SDC_Init(_fat) res=SDC_FStat("0:/protokol.csv", _attrib) Msg_WriteWord(_attrib(0)) Msg_WriteText(" SD_READ_FILE_STATUSr") res=SDC_FOpen(_fil, "0:/protokol.csv", FA_WRITE Or FA_CREATE_ALWAYS) Msg_WriteText("SDC_FOpen " ) Msg_WriteInt(res):Msg_WriteChar(13) Attrib0 = _attrib(0) res=SDC_FSeek(_fil, Attrib0) Msg_WriteFloat(Attrib0) Msg_WriteText(" SDC_FSeek " ) Msg_WriteInt(res):Msg_WriteChar(13) SDC_FWrite(_fil,Text,Str_Len(Text),bytes_written) SDC_FSync(_fil) Msg_WriteInt(bytes_written(0)) Msg_WriteText(" SDC_FWrite " ) Msg_WriteInt(res):Msg_WriteChar(13) res=SDC_FSetDateTime("0:/protokol.csv",Clock_GetVal(3) + 1,Clock_GetVal(4) + 1,Clock_GetVal(5) + 2000, _ Clock_GetVal(1), Clock_GetVal(2), Clock_GetVal(0)) Msg_WriteText("SDC_FSetDateTime " ) Msg_WriteInt(res) Msg_WriteChar(13) res=SDC_FClose(_fil) Msg_WriteText("SDC_FClose " ) Msg_WriteInt(res) Msg_WriteChar(13) AbsDelay(5) End Sub | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum