[Résolu] Tableau et fichier sur carte SD

Bonjour,
après plusieurs heures passer sur Internet à chercher une solution à mon problème, je post sur le forum le plus concerné :slight_smile:
Voila, j'aimerais rentrer dans un tableau des valeurs qui proviennent d'un fichier texte lu sur la racine d'une carte SD.

Le fichier texte ressemblerait à ceci (couleurs codées en Hexadécimal pouvant être modifié)

0x000000,0x000000,0xFF0000,0xFF0000,0xFF0000,0xFF0000,0xED7F10,0xED7F10,0xED7F10,0xED7F10,0xFFFF00,0xFFFF00,0xFFFF00,0xFFFF00,0x00FF00,0x00FF00,0x00FF00,0x00FF00,0x0000FF,0x0000FF,0x0000FF,0x0000FF,0x791CF8,0x791CF8,0x791CF8,0x791CF8,0x8806CE,0x8806CE,0x8806CE,0x8806CE,0x000000,0x000000

J'aimerais rentrer toutes ces valeurs dans un tableau (ici, de taille 32)
Pour faire simple,

Je lis le fichier "Config1.txt" sur ma carte SD
Tab[0] devra contenir 0x000000
Tab[1] devra contenir 0x000000
Tab[2] devra contenir 0xFF0000
...
Tab[29] devra contenir 0x8806CE
...

Le problème est que je n'arrive pas à dire à l'arduino de lire les 8 premiers octets (0x000000) et de les mettre dans Tab[0], les 8 suivants (0x000000) (sans prendren en compte les ',') et les mettre dans Tab[1] et ainsi de suite.
Une fois le tableau plein, j'envoi les données, puis je recommence l'opération avec les 32 données qui sont sur la ligne suivante du fichier (encore un problème, comment dire d'attendre puis de passer à la ligne suivante sans recommencer le fichier du début).

Sur Internet, j'ai trouvé pas mal d’exemples (qui correspondent à une petite partie de se que je souhaite), mais non commenté et pas toujours simple à comprendre.

Merci d'avance

Alexis.

Bonjour,

En partant du principe que tes valeurs hexa font toujours le même nombre de caractère.

Voici l'algorithme que tu doit implémenter :

  1. crée un buffer de 9 char ("0x000000" = 8 char + \0 de fin de chaine ASCIIZ)
  2. dans un boucle while (fichier.available() > 8 )
  3. lit 8 char avec file.read(buffer, 8 )
  4. transforme ce buffer en chaine ASCIIZ en ajoutant un \0 à la fin : buffer[8] = '\0';
  5. utilise la fonction strtol() pour "parser" la valeur hexa et avoir un "long int"
  6. stocke le long int dans ton tableau
  7. lit un caractère (pour faire sauter la virgule)
    8 ) continue ta boucle while() du point 2

Merci Skywodd de ta réponse.
Les codes couleurs en hexa sont toujours de la même forme (0xRRVVBB)
J’essaierais ce code demain ou mardi (obliger d'attendre les séance de TP ...), je te tiens au courant.
Alexis.

Bonsoir,
j'ai essayer le code suivant aujourd'hui, et sa ne fonctionne pas comme je le voudrais :confused:

  File cfg=SD.open("AEC.txt");
  while(cfg.available()>8){
    cfg.read(buffer, 8);
    buffer[8]='\0';
    c=strtol(buffer, NULL, 16);
    LED[i]=c;
    i++;
    cfg.read();
  }

Lorsque j'affiche sur le terminal les valeurs du tableau LED[], je retrouve des valeur qui ne sont pas celle que je souhaite (valeurs obtenues en décimal et non en hexa).
Par exemple,
LED[2] contient 16711680 (il s'agit bien du code décimal de FF0000)
mais je souhaiterais
LED[2] = 0xFF0000

Je pense que l'erreur peut venir de la fonction strtol() puisque je ne l'ai encore jamais utilisé :confused:
Merci

Alexis.

Bon déja voici un code avec la gestion des possibles erreurs (c'est mieux) :

char buffer[9]; // Buffer 0x?????? + \0
unsigned long values[16]; // Maximum de 16 valeurs (au pif)
byte i = 0; // Itérateur

/* Ouverture du fichier source */
File f = SD.open("test.txt");

/* Tant que des données sont disponible */
while(f.available() >= 8) { // >= pour ne pas "oublier" la dernière valeur
	
	/* Remplissage du buffer */
	f.read(buffer, 8);
	
	/* Cloture de la chaine ASCIIZ */
	buffer[8]='\0';
	
	/* Lecture de la valeur */
	values[i] = strtol(buffer, NULL, 16);
	
	/* Vérification pour éviter un buffer-overflow */
	if(++i == sizeof(values)) break;
	
	/* Ignore le ; séparateur */
	f.read();
}

/* Fermeture du fichier source */
f.close();

Alex_38:
Lorsque j'affiche sur le terminal les valeurs du tableau LED[], je retrouve des valeur qui ne sont pas celle que je souhaite (valeurs obtenues en décimal et non en hexa).
Par exemple,
LED[2] contient 16711680 (il s'agit bien du code décimal de FF0000)
mais je souhaiterais
LED[2] = 0xFF0000

Toc toc, allo la terre !
Un nombre en mémoire c'est une suite d'octets, la représentation du dit nombre le cpu sans fout complétement.
Pour lui un nombre c'est une série de bits 0/1, ni plus ni moins.

LED[2] = 0xFF0000
ou
LED[2] = 16711680
C'est la même chose !
C'est juste ton interprétation en tant qu'humain qui est différente.

Dans le même genre :
LED[2] = 077600000
c'est la même chose que LED[2] = 0xFF0000 mais en notation octale.

C'est à toi de faire l'affichage comme tu l'entends :
Serial.print(x) -> affichage en entier
Serial.print(x, DEC) -> affichage en flottant
Serial.print(x, HEX) -> affichage en hexadécimal

Bonsoir,
oui, en effet c'est idem. J'en ai parler avec mon groupe de projet tout à l'heure et je n'avais pas réfléchi sur le fait que c'était une suite de 1 et de 0 (même si je sais que sa correspond). Je voulais l'afficher en hexa parce que on avait défini au départ de rentrer les valeurs en hexa dans le programme, alors que cela n'a aucune importance.
Après une avoir passé une bonne nuit, tout est bien en place dans ma tête :slight_smile:

Il ne me reste qu'une chose à vous demander; si un fichier contient plusieurs lignes (données sur la première ligne -> données à mettre dans le tableau puis envoyer les données, puis données sur la deuxième lignes -> données à mettre dans ce même tableau à la place de celles d'avant (et faire ceci pour x lignes))
Comment puis-je faire pour remplacer ces valeurs par celles des lignes suivantes ?

Merci en tout cas pour l'aide que tu m'as apporter, sans cette fameuse fonction, j'aurai pu chercher longtemps et mon projet n'aurai jamais abouti.

Alexis.

Alex_38:
Il ne me reste qu'une chose à vous demander; si un fichier contient plusieurs lignes (données sur la première ligne -> données à mettre dans le tableau puis envoyer les données, puis données sur la deuxième lignes -> données à mettre dans ce même tableau à la place de celles d'avant (et faire ceci pour x lignes))
Comment puis-je faire pour remplacer ces valeurs par celles des lignes suivantes ?

Test le séparateur au lieu de juste l'ignorer.
Si c'est un point virgule tu continues, si c'est un \n tu remets i à 0.

Bonsoir,
merci beaucoup Skywodd pour ton aide.
Pour le problème du retour à la ligne, j'ai modifier un peu puisque le µc lisait des '\n' a peu près partout.
L'algorithme est le suivant

  1. Je lis le fichier.
  2. Je met les valeurs lu (convertie grâce au buffer et a strtol()) dans la tableau.
  3. Si l'indice du tableau est égal à sa taille max :
  • J'envoi les données du tableau
  • Je lis un caractère pour passer à la ligne (lire '\n')
  • Je remet i à 0
  1. Je recommence l'opération jusqu'à la fin du fichier.

Problème résolu.

Merci beaucoup

Alexis.