Auteur Sujet: Lecture d'une carte SD  (Lu 16945 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1715
    • Voir le profil
Re : Lecture d'une carte SD
« Réponse #15 le: octobre 24, 2021, 07:58:34 pm »
Bonsoir,

Si il s'agit d'écrire et de lire des données dans un fichier de la SD card, il est moins coûteux et plus simple d'écrire en binaire via write et de lire via read plutôt que de passer via des chaînes de caractères.

read et write ont notamment une version avec 2 arguments. Le premier est un pointeur vers les données en mémoire (un uint8_t ¨*) et le second le nombre d'octet.

Ainsi écrire un entier de 32 bits se ferait comme suit :

uint32_t donnee = 128000;
file.write((uint8_t *)&donnee, sizeof(donnee));

De manière symétrique, on lirait comme ceci :

file.read((uint8_t *)&donnee, sizeof(donnee));

Les deux méthodes retournent le nombre d'octets effectivement écrits ou lus. Ça permet de vérifier que tout se passe bien, que la carte n'est pas pleine, qu'on n'a pas atteint la fin de fichier :

if (file.read((uint8_t *)&donnee, sizeof(donnee)) != sizeof(donnee)) {
    // erreur
}

Je n'ai pas de SD card et je ne peux donc pas fournir un exemple testé.
Cordialement

likiki

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : Lecture d'une carte SD
« Réponse #16 le: octobre 29, 2021, 06:18:52 pm »
J'ai cherché, trouvé et adapté, voilà ce que cela donne.

Je pense que cela vas en aider plus d'un.

/*
 * Récupération de données numérique present
 * sur une carte SD dans un fichier .txt
 * pour les mettre dans une variable
 * pour réutilisation dans le programme.
 *
 * 29/10/21
 *
 * C.A
 *
 */



#include <SPI.h>              // Interface pour carte SD
#include <SD.h>

#define sdCardCsPin  53       // Chip Select du lecteur de carte SD à adapter 9 pour UNO 53 pour MEGA

String logFileName = "";      // Nom du fichier d'enregistrement (Texte)
char logSdFileName[13];       //                     ""          (char)

int x, y, z;
// float xfl, yfl, zfl;

void setup()
{
  Serial.begin(9600);

  delay(500);
  //------------------------------------- Demarrage carte SD
  Serial.println("Initialisation carte SD...");         
  if (!SD.begin(sdCardCsPin))   // Si la carte SD ne repond pas
  {
    Serial.println("Carte SD out ou absente");
    return;
  }
  Serial.println("Carte SD OK\n");
 
  logFileName = "PosPlat.txt";  // longueur max 8+3 caractères
  logFileName.toCharArray(logSdFileName, 13);

 
  Serial.print("Niveau reseau ==> ");
  x = dataFileGetIndexValue(1);  // Rechercher la valeur à la ligne 1
  Serial.println(x);
 
  Serial.print("Position -1 ====> ");
  x = dataFileGetIndexValue(2);  // Rechercher la valeur à la ligne 2
  Serial.println(x);

  Serial.print("Position -2 ====> ");
  x = dataFileGetIndexValue(3);  // Rechercher la valeur à la ligne 3
  Serial.println(x);

  Serial.print("Position -3 ====> ");
  x = dataFileGetIndexValue(4);  // Rechercher la valeur à la ligne 4
  Serial.println(x);

  Serial.print("Position -4 ====> ");
  x = dataFileGetIndexValue(5);  // Rechercher la valeur à la ligne 5
  Serial.println(x);

  Serial.print("Position -5 ====> ");
  x = dataFileGetIndexValue(6);  // Rechercher la valeur à la ligne 6
  Serial.println(x);


  while(1){}

}

void loop()
{
}

float dataFileGetIndexValue(int lineIndex)
{
  String lineFromSd;
  float returnValue = -1;
  int valueIndex = 1;
 
  File dataFile = SD.open((String)logSdFileName, FILE_READ);

  if (dataFile)
  {
    while (dataFile.available())
    {
      lineFromSd = dataFile.readStringUntil('\n');
      String varName = lineFromSd.substring(0, lineFromSd.indexOf(":"));     // On prends la partie gauche pour extraire le nom de la variable
      varName.toUpperCase();                                                 // Le nom de la variable, mise en majuscule
      varName.trim();                                                        // Enlever les espaces inutiles
      String varValue = (lineFromSd.substring(lineFromSd.indexOf(":") +1));  // On prends la partie droite comme valeur
      if (valueIndex == lineIndex)                                           // Si arrivé à la ligne désirée
      {
        returnValue = varValue.toFloat();                                    // Que l'on transforme en valeur float
      }
      valueIndex ++;                                                         // Pour la ligne suivante
    }
  }
  else
  {
    Serial.println("BAD " + String(logSdFileName));
  }

  dataFile.clearWriteError();
  dataFile.close();

  return returnValue;
}

Une copie d'écran du résultat sur la pièce jointe.

Merci a tous pour votre aide précieuse.