Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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
Ich nutze:
C-Control Pro AVR32, eigenes Board
> > > > 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: