AVR & MMC, veta vart end of file är
AVR & MMC, veta vart end of file är
Jag håller på tillsammans med en kompis med ett projekt där vi ska spara undan data på ett minneskort, data kommer sparas en gång per dag och allt drivs med solceller. Vi har fått till så man kan skriva till minneskortet till en specifik fil så FAT formatet funkar. Problemet är att då systemet har gjort en reset eller strömen försvunnit (det har varit natt) så vet man inte längre hur många bytes man skrivit. Vi testade att skriva en variabel till minneskortet men i det läget måste man veta ifall man tömt minneskortet så man kan nolla den räknare (plus att det blev väldigt stor fil för den skriv ut väääldigt många mellanrum)
Funderar nu på hur man ska kunna lägga till data sist i en fil. Jag vet att i CSHARP finns det en funktion som heter APPEND men den verkar inte finnas i detta läge.
Man skulle kanske kunna läsa filen en byte i taget och sedan ha någon bestämd kod
if(read_byte == 0xFF)
så vet man att filen är slut. Det jag läst om hitills är att det finns ett sätt att flytta fram läs/skrivpekaren men då måste man veta hur många bytes framåt man ska flytta pekaren.
Har bara funderat på detta idag så en så länge är det ingen panik men tänkte om någon hade gjort något liknade eller hade någon bra idé.
Som det ser ut just nu kommer jag nog implemetera läsa hela filen för att se hur många bytes som finns och när man läst hela filen så kan man flytta fram skrivpekaren, detta om ingen har någon bättre idé
//Joel
Funderar nu på hur man ska kunna lägga till data sist i en fil. Jag vet att i CSHARP finns det en funktion som heter APPEND men den verkar inte finnas i detta läge.
Man skulle kanske kunna läsa filen en byte i taget och sedan ha någon bestämd kod
if(read_byte == 0xFF)
så vet man att filen är slut. Det jag läst om hitills är att det finns ett sätt att flytta fram läs/skrivpekaren men då måste man veta hur många bytes framåt man ska flytta pekaren.
Har bara funderat på detta idag så en så länge är det ingen panik men tänkte om någon hade gjort något liknade eller hade någon bra idé.
Som det ser ut just nu kommer jag nog implemetera läsa hela filen för att se hur många bytes som finns och när man läst hela filen så kan man flytta fram skrivpekaren, detta om ingen har någon bättre idé
//Joel
Re: AVR & MMC, veta vart end of file är
Eftersom vi inte vet hur systemet ser ut går det inte ge något svar. Dock hadde iaf jag ej valt C#.
Re: AVR & MMC, veta vart end of file är
http://www.frank-zhao.com/cache/fat_sd.php
om du bara sparar en gång per dag kan du väl stänga filen mellan skrivningarna?
om du bara sparar en gång per dag kan du väl stänga filen mellan skrivningarna?
Re: AVR & MMC, veta vart end of file är
I FAT skriver filsystemsdrivaren in vilka klusterblock som tillhör en specifik fil. Detta kan användas för att ta reda på hur stor en fil egentligen är. För att veta exakt måste dock man läsa filstorleken i listan över filer (directory). Men den senare kan missas att skrivas vid avbrott så man får en fil på "0 bytes" som tar upp flera MByte..
På precis samma sätt kan data skrivas i kluster innan de reserveras, eller tvärtom.
En del teknisk information finns på wikipedia.
På precis samma sätt kan data skrivas i kluster innan de reserveras, eller tvärtom.
En del teknisk information finns på wikipedia.
Re: AVR & MMC, veta vart end of file är
Tack för svaren!
@blueint Jag kommer inte göra det i C# detta är på en atmega processor så allt är skrivet i C. Jag menade bara på att jag använt en funktion i C# som gör det jag vill!
Ska läsa wikipedia länken imorgon, nu känner jag att jag är för trött för att sätta mig in i det nu!
Men om man ser till att ett avbrott inte kan ske under tiden man jobbar med en fil borde problemet med allokering och liknande kunna kringgås?
@nifelheim Ja det kommer vara typ 10 filer som alla kommer uppdateras en gång per dag så filerna kommer stängas emellan. Problemet är att när jag skriver f_write(&logFile, "TEXTEN SOM SKA SKRIVAS", antal bytes, &byteswritten) så börjar den på plats 0 i filen och på så sätt skriver över det som redan står där.
Som sagt kommer använda mig av C, jag tror jag har en lösning som kommer funka men kanske inte är det snyggaste sättet att göra det på. Min idé är att läsa filen jag ska skriva till för att sedan när man läst klart allt som finns i filen flytta fram write pekaren lika långt som man just läst.
Denna har jag använt för att få igång fat och liknande!
Kan rekomendera den, var faktiskt relativt enkelt att i alla fall komma igång.
Det biblioteket har en funktion som heter f_lseek som flytta read/write pekaren.
//Joel
@blueint Jag kommer inte göra det i C# detta är på en atmega processor så allt är skrivet i C. Jag menade bara på att jag använt en funktion i C# som gör det jag vill!
Ska läsa wikipedia länken imorgon, nu känner jag att jag är för trött för att sätta mig in i det nu!
Men om man ser till att ett avbrott inte kan ske under tiden man jobbar med en fil borde problemet med allokering och liknande kunna kringgås?
@nifelheim Ja det kommer vara typ 10 filer som alla kommer uppdateras en gång per dag så filerna kommer stängas emellan. Problemet är att när jag skriver f_write(&logFile, "TEXTEN SOM SKA SKRIVAS", antal bytes, &byteswritten) så börjar den på plats 0 i filen och på så sätt skriver över det som redan står där.
Som sagt kommer använda mig av C, jag tror jag har en lösning som kommer funka men kanske inte är det snyggaste sättet att göra det på. Min idé är att läsa filen jag ska skriva till för att sedan när man läst klart allt som finns i filen flytta fram write pekaren lika långt som man just läst.
Denna har jag använt för att få igång fat och liknande!
Kan rekomendera den, var faktiskt relativt enkelt att i alla fall komma igång.
Det biblioteket har en funktion som heter f_lseek som flytta read/write pekaren.
//Joel
Re: AVR & MMC, veta vart end of file är
I C har man filåtkomst antingen via FILE * (fopen,fseek,fwrite,fclose) eller via int fd (open,lseek,write,close).
För att lägga till i en loggfil med standard C bibliotek API:
För att lägga till i en loggfil med standard C bibliotek API:
Kod: Markera allt
#include <stdio.h>
int main(){
FILE *fp;
if( (fp=fopen("logg.txt","a")) != NULL ){
fwrite("Kalle öppnade dörren", 21, 1, fp);
fprintf(fp, "Kalle öppnade dörren igen");
fclose(fp);
}
Re: AVR & MMC, veta vart end of file är
Använder du tinyfatfs ? Du bör väl kunna använda f_lseek för att hitta slutet på filen och sen bara skriva där?
http://elm-chan.org/fsw/ff/en/lseek.html
/* Move to end of the file to append data */
res = f_lseek(file, f_size(file));
Det är ett mycket trevligt filsystem.
MVH: Mikael
http://elm-chan.org/fsw/ff/en/lseek.html
/* Move to end of the file to append data */
res = f_lseek(file, f_size(file));
Det är ett mycket trevligt filsystem.
MVH: Mikael
Re: AVR & MMC, veta vart end of file är
Ett journalfilsystem vore egentligen bättre i tillämpningar där avbrott kan förekomma. FAT är egentligen riktigt kasst ur den aspekten.
Re: AVR & MMC, veta vart end of file är
@blueint: jag lyckas mounta, öppna, skriva och stänga filen. Problemet är ju att nästa gång jag öppnar filen börjar den från början av filen och skriver över det som redan finns där.
@adent: Ja exakt den funktionen läste jag om också, men jag har inte f_size funktionen i mitt bibliotek vad jag kan hitta.
Funderar på om man kan lägga till den funktionen själv, men laddade ner senaste från ELM sidan, kollade lite snabbt och såg inte någon f_size i ff.c (där jag tror att den ska vara) Söker jag i mina inkluderade filer hittar jag ingen f_size.
Medans jag skrev nu kom jag på en grej och gick in och kollade. Det är tydligen så att structen FILE har en medlem som heter fsize
så om man använde sig av funktionen
f_lseek(FILE, FILE.fsize) går det alldeles utmärkt att förtsätta skriva i slutet av en fil! (även om den inte lyckas läsa mina enter just nu)
@adent: Ja exakt den funktionen läste jag om också, men jag har inte f_size funktionen i mitt bibliotek vad jag kan hitta.
Funderar på om man kan lägga till den funktionen själv, men laddade ner senaste från ELM sidan, kollade lite snabbt och såg inte någon f_size i ff.c (där jag tror att den ska vara) Söker jag i mina inkluderade filer hittar jag ingen f_size.
Medans jag skrev nu kom jag på en grej och gick in och kollade. Det är tydligen så att structen FILE har en medlem som heter fsize
så om man använde sig av funktionen
f_lseek(FILE, FILE.fsize) går det alldeles utmärkt att förtsätta skriva i slutet av en fil! (även om den inte lyckas läsa mina enter just nu)