[RESOLU] Formatage fichier XML

Bonjour à tous,
j'avais pour idée de stocker des données sur une carte SD sur un format .CSV (séparateur :wink:

Nbreimpulsion;Millis;Heure;Minute;Seconde;Jour;Mois;Annee
0;2546;19;34;44;28;10;2012;
1;122545;19;36;44;28;10;2012;
1;242545;19;38;44;28;10;2012;
1;362547;19;40;45;28;10;2012;
1;482547;19;42;45;28;10;2012;
1;602549;19;44;45;28;10;2012;
1;722549;19;46;45;28;10;2012;
1;842551;19;48;45;28;10;2012;
1;962551;19;50;45;28;10;2012;

je me demande pour plus de flexibilité d'échange avec d'autres systèmes si je ne devrais pas mieux utiliser le format XML.

J'ai regardé comment le formater mais avant de faire des conneries pouvez vous me donner un exemple de manière de formater les données de façon correct et est ce que je pars dans la bonne direction en utilisant xml ?

vu la nature des infos, faire un xml serait vraiment se casser les pieds... surtout qu'il faudra coder soit même les fonctions...

Mais enregistrer au format xml n'est pas bien compliqué. Ce qui serait plus ennuyeux, serait de coder le parser qui permet de les lire (sur l'arduino).

En fait j'ai vu dans un autre post que c'était faisable de parser du XML avec un arduino

Et l'utilisation du XML est pour pouvoir utiliser les donnes avec un autre système

Par contre en effet cela risque de donner un truc de compliqué ...
le XML n'est peut etre pas fait pour ce genre de stockage puis de restitution

Salut,

Je suis entièrement d'accord avec Vohu ! Et puis le CSV est également très courant et peut être exploité simplement par de nombreuses applications. Que comptes-tu faire de ce fichier au juste ?

++

En fait je désire envoyer l'information de "production" toutes les X minutes à un serveur.
Si l'envoie se passe bien alors je ne stockerai pas la valeur sur l'arduino.
Par contre si la transmission échoue je stocke sur la carte SD puis cycliquement je retenterai un envoie au serveur.

Ces pour cette partie cyclique que je trouvait que la structure XML pouvait m'aider à retrouver les donner pour les renvoyer au serveur et puis pourquoi pas ensuite acceder au données par une carte arduino qui afficherait la valeur en "temps réel" sur un afficheur déporté ou sur une page Web.

Mais d'après ce que vous dites cela ne semble pas le XML le plus adpaté.

C'est surtout que l'Arduino reste limité et que le XML est relativement lourd. Etant donné que les données à gérer sont simples, autant faire simple :wink:

moi j'aurai gardé le format csv, mais, si tu veux faire un xml, c'est pas compliqué.

Il suffit d’appeler une fonction du genre :

ecrireblocXML(nomduBloc, info1, info2, info3...)
{
     sprintf(bloc, "<%s>\n", nomduBloc);
     sprintf(bloc, " %s   <info1>%s</info1>\n", bloc, info1);
     sprintf(bloc, " %s   <info2>%s</info2>\n", bloc, info2);
     sprintf(bloc, " %s   <info3>%s</info3>\n", bloc, info3);
     sprintf(bloc, "</%s>\n", bloc);

    file.write(bloc);
}

attention, j'ai pas testé, il manque l'initialisation des variables, les types, et j'ai pas tenu compte des pointeurs (et sans doute plein de choses encore), c'est pour te montrer l'idée... Il faut aussi faire 2 fonctions qui appellées au bon moment écriront l'entête du xml et sa fin. et voilà, le tour est joué.

Faut pas oublier qu'un arduino n'a pas beaucoup de place en mémoire...

Mon dernier projet qui utilisait la carte SD et ethernet en même temps m'a obligé à nettoyer radicalement mon programme.. car il n'y avait plus assez de place... sur 32Ko, je crois qu'il était meme conseillé de ne pas dépasser le 30Ko...
Faire une fonction qui écrit du xml, t'oblige à écrire beaucoup de chaines de caractères dans ton programme... Et ça, ça prends malheureusement beaucoup de place...

-1 aussi pour le XML
En plus un fichier XML est plus compliqué a gerer en ajout
Il faut quasiment le ré-écrire entièrement à chaque ligne que tu veux ajouter.

Garder le CSV sur l'Arduino est plus simple.
Au serveur de faire la conversion si besoin, il aura plus de puissance pour cela.

Bon et bien devant votre enthousiasme avec mon idée de XML et bien je vais l'abandonner !
et continuer avec mon format csv même si cela semble plus galère pour identifier les données à renvoyer au serveur après.
De plus est ce possible de supprimer uniquement une ligne dans le fichier ou est ce que l'on doit stocker tout le fichier en mémoire puis supprimer la ligne que l'on désire et enfin tout réécrire ?

bienvenue dans le monde du C.

Effectivement, changer une ligne en C, consiste à réécrire tout le fichier, avec la ligne modifiée, ou, sans cette ligne si on veut la supprimer.

Sur le serveur, il n'y aura aucun problème à identifier les données, puisqu'elles restent dans le même ordre pour chaque ligne. Ca sous entend évidement, que si une valeur d'une ligne devait être omise, il doit quand même apparaître une valeur vide dans le CSV, soit 2 virgules qui se suivent. Si non, il y aura un décalage lors de la lecture.

Etant donné la nature des données stockées dans ton CSV, le XML ne t'apporterait rien à par des cheveux blancs en créant les fonction sur l'Arduino.
Faire un petit script sur le serveur (coté PC) qui te le passe en XML te posera nettement moins de soucis.

Bonjour,

+1 pour l'avis général, le format CSV est bien mieux.

Surtout que même côté serveur le format CSV est plus simple à gérer que du XML.
Pour parser du CSV il faut faire un découpage de chaine de caractère ligne par ligne, c'est 3x rien à coder.
Pour parser du XML il faut prendre en compte l'architecture du fichier, l'encodage, ...

Pour ce qui est du renvoi des données "offline" c'est pas compliqué, comme elles sont toute dans un ordre chronologique il te suffit d'envoyer toutes les données du fichiers en une seule fois.
Le problème c'est que tu ne peut pas enlever une ligne bien précise dans un fichier sans tout lire / réécrire.
Donc si l'envoi du fichier complet échoue tu auras des problèmes pour gérer la situation.

Le mieux serait de faire un dossier avec un fichier par trame à émettre, numéro dans un ordre croissant, une sorte de file d'attente d'envoi avec des fichiers.
Tu envois fichier par fichier dans l'ordre, si ça marche tu supprime le fichier, si ça plante tu laisse le fichier en place pour la prochaine fois.

du coup, s'il fait un fichier par ligne... et qu'il supprime les fichiers qui ont étés envoyés, il n'y a plus de problème :o

Je vais partir dans ce sens yapluka comme on dit :slight_smile:
par contre qu'elle est la limite du nombre de fichier sur la carte SD ?

en fat 16:
65 524 fichier sur la partition, et apparement 512 fichier à la racine (en ne dépassant pas le nomage en 8.3) par contre, je ne sais pas de ce qu'il en est dans un autre dossier...

Je ne sais pas s'il est possible de lire la fat32 (qui est bien moins limitative) avec la librairie sd

D'après la page de la bilbiothèque SD, elle gère le FAT32 :slight_smile:

C'est bien 512 fichiers ou répertoires pour le répertoire racine car la FAT pour le répertoire racine est de taille fixe
Cette limite saute pour les sous répertoires qui peuvent être étendus dynamiquement sur plusieurs clusters

... en théorie

Car effectivement il faudrait vérifier que l'implémentation Arduino permette de gérer le cas général.
A la place de l'auteur, je ne me serais pas embarrassé d'une implémentation complète pour un micro 8 bit.

j'essaie déjà de former le nom du fichier me permettant de créer le fichier sur la carte SD.
voila une partie du code mais cela ne créé pas le fichier avec le nom espéré ... lol
la nuit porte conseil comme ondit

nbrefichier = nbrefichier + 1;
    nomfichier = nbrefichier + ".txt";
    char charBuf[nomfichier.length()+1];
    nomfichier.toCharArray(charBuf, nomfichier.length()+1);
    
    Serial.println(nomfichier);
    //---- crée fichier en écriture --- 
    file = SD.open(charBuf, FILE_WRITE); // ouvre le fichier en écriture

pourquoi ne pas coder le nom du fichier en C plutot qu'en C++ ?

Euh j'ai fait ca moi ? :astonished: