Lire, écrire et modifier un fichier à un endroit précis

Bonjour,

Meilleurs voeux à ceux à qui je ne l'ai pas encore souhaité !

Je travaille sur un projet sur lequel j'ai besoin d'enregistrer des choses sur carte SD, des paramètres par exemple.

Je voulais faire un fichier qui contiendrait des variables qui seraient chargées au démarrage, modifiable pendant l'utilisation et enregistrable.

Or, la fonction d'écriture de la lib SD est trop limitée pour faire ça. Que me conseillez vous ? En sachant que je pense qu'il ne restera pas assez de mémoire sur l'arduino pour charger toutes les variables et toutes les réécrire après stockage dans un tableau. Pour lire le tableau je vais parser en C. C'est vraiment l'étape de modification du fichier qui me pose problème.

J'avais bien pensé au XML mais je n'ai pas encore trouvé de librairie qui lise le XML.

Merci,

Bien à vous

bonjour,
tu peux t'inspirer de ce tuto
http://overskill.alexshu.com/saving-loading-settings-on-sd-card-with-arduino/

Oui je comprends ce qu'il a voulu faire mais ça ne règle pas son problème... J'ai déjà écris quelque chose en C pour analyser le fichier. Ce que j'aimerais c'est pouvoir écrire dedans sans avoir à tout réécrire car je ne pense pas disposer de suffisamment de mémoire pour tout charger et tout réécrire, mon programme étant déjà d'une taille conséquente...

pierreko:
J'avais bien pensé au XML mais je n'ai pas encore trouvé de librairie qui lise le XML.

Ouch ! si tu dis que tu as trop de paramètres pour les faire tenir tous en mémoire, oublie le XML, c'est bien trop verbeux et lourd à manipuler.

De même, quand tu parles de parser un tableau, s'il y a beaucoup de choses à stocker, tu arriveras en limite de mémoire également.

Pour moi, il y a 2 choses à envisager (et à mixer) :

  • si tu peux regrouper tes données par familles/groupe/ce que tu veux, tu peux multiplier les petits fichiers.
    au pire, tu pourrais même avoir un fichier par valeur : machin=42 devient un fichier nommé "machin" et contenant juste 42

  • stocker des structure en binaire : s'il n'y a que l'arduino qui doit lire / écrire, et que tu n'as donc pas besoin que les données soient "humainement lisibles", tu peux stocker les données en mémoire dans un "struct" et le lire/écrire "en vrac" dans des fichiers.

struct mesParametres {
    int machin;
    byte truc;
    char chose[10];
} p;

// ...

// pour lire les paramètres
File f = SD.open("params", FILE_READ);
f.read((byte *)&p, sizeof(p));
f.close();

// ici, le paramètre machin est accessible par p.machin

// pour les écrire
File f = SD.open("params", FILE_WRITE);
f.seek(0);
f.write((byte *)&p, sizeof(p));
f.close();

Le code est approximatif, je n'ai pas de quoi le tester, mais l'idée est là ...

En passant, dans la lib SD il y a une fonction "seek" qui permet de se déplacer dans un fichier. C'est une autre piste à creuser pour lire/écrire uniquement des bouts.

Si tu ne peux pas lire toutes tes variables en une fois tu peux aussi multiplier les fichiers et traiter les variables par paquets.
Sinon rien ne t'empêche d'avoir une mémoire flash externe chargée de l'archivage de ces variables.

Pour moi, le problème est plutôt là:

En sachant que je pense qu'il ne restera pas assez de mémoire sur l'arduino pour charger toutes les variables et toutes les réécrire après stockage dans un tableau.

Parce que ça c'est indépendant du mode de stockage. Donc je pense qu'il faudrait peut-être revoir ta façon de manipuler tes paramètres de configuration.