[Résolu]Convertion Byte to String

Bonjour à tous,

J'ai un petit souci,

lorsque je lis les informations de mon fichier avec cette methode:

void readFile(char filename[]){
   Serial.println("Lecture fichier");
   File theFile = SD.open(filename);
    if (theFile) {
      Serial.print(" c'est parti: ");
      Serial.println(filename);
      // lecture du fichier jusqu'à la fin:
      while (theFile.available()) {
      Serial.write(theFile.read());
    }
    // Fermeture du fichier:
    Serial.println("Fin");
    theFile.close();
  } 
  else {
    // Ouverture impossible:
    Serial.print("Ouverture impossible de ");
     Serial.println(filename);
  }
}

Celà fonctionne parfaitement. Mais je voudrais récupérer les informations que je lis dans un string. Pour celà j'ai modifier ma méthode :

String readFile(char filename[]){
  String page=" ";
  Serial.println("Lecture fichier");
  delay(1);
  File theFile = SD.open(filename);
  if (theFile) {
      Serial.println(" c'est parti:");
      Serial.println(filename);
      // lecture du fichier jusqu'à la fin:
      while (theFile.available()) {
      // la ligne ci-dessous pose Problème
      page =page+theFile.read();
      
      //Serial.write(theFile.read());
    }
    // Fermeture du fichier:
    Serial.println(page);
    Serial.println("Fin");
    theFile.close();
      return page;
  }else {
    // Ouverture impossible:
    Serial.println("Ouverture impossible de :");
    Serial.println(filename);
    return page;
  }
}

Voilà je n'arrive pas à convertir un byte en string. D'avance Merci.

Bonjour,

A mon avis le probléme est trés simple. String page est une variable local, avant de quitter la fonction celle ci sera désallouer, or tu fait un return de cette variable. Celle ci n'existant plus au moment du return tu te retrouve avec n'importe quoi.

Essaye avec un passage par référence :

// Passage de "page" par référence (équivalent d'un passage par pointeurs, sans pointeurs)
void readFile(String &page, char *filename){
  page = ""; // Vide la String
  
  File fi = SD.open(filename); // Ouverture du fichier
  if (!fi) { // Gestion d'erreur
    Serial.print("Erreur open() ");
    Serial.println(filename); // Message d'erreur
    return;
  }
  
  while (fi.available()) // Lecture jusqu'a EOF
    page += fi.read(); // Ajout d'un char à la String

  fi.close(); // Fermeture du fichier
}

PS: charger un fichier entièrement en ram est la pire des mauvaise idées, tu n'as que [u]2Ko de ram[/u] sur une carte arduino, et seulement [u]500 octets de libre[/u] une fois que la librairie SD est chargé. A moins que ton fichier ne fasse que quelques caractéres (une dizaine par exemple) tu auras des problémes de manque de ram très rapidement.

// la ligne ci-dessous pose Problème
      page =page+theFile.read();

Pourquoi cette ligne pose problème ?

Tu ne dis pas ce qu'il se passe exactement.

Quelle est la taille de ton fichier ? Est-il fait de plusieurs lignes ? Si oui, veux-tu réellement le lire entièrement dans une grosse string ? (attention tu n'a que 2KO sur un Arduino) ?

Merci pour vos réponses . Je vois d'où vient le problème.

Quelle est la taille de ton fichier ?

Ha c'est peut être pour ca que ca bug. Car mon fichier fait 2665 octect

Est-il fait de plusieurs lignes ?

oui, c'est une page Web

Si oui, veux-tu réellement le lire entièrement dans une grosse string ? (attention tu n'a que 2KO sur un Arduino) ?

Bon beh voilà, j'ai complètement zappé ce paramètre. Ce que je veux faire c'est de lire un fichier html qui se trouve sur une sdcard et l'afficher sur une page web. Quelle serait la meilleur solution ? écrire la page web dans le code me semble très lourd non ?

Il faut la lire par morceau de la SD en même temps que tu pousse la réponse. pas besoin de la garder en permanence en mémoriser.

En fait c'est le même principe que ton 1er exemple mais avec la sortie Web au lieu de Serial.

guispeed4262: Ce que je veux faire c'est de lire un fichier html qui se trouve sur une sdcard et l'afficher sur une page web. Quelle serait la meilleur solution ? écrire la page web dans le code me semble très lourd non ?

Pourquoi donc lire la page, la mettre dans une string pour ensuite la renvoyer ? Quand tu as besoin d'envoyer la page tu lit un octet de la carte sd, et tu le renvoi directement sur l'ethernet (ou le wifi je sait pas ce que tu utilise).

En gros : - si quelqu'un demande la page html - ouvre le fichier - envoi l'entête http - tant que non fin de fichier -- tu lit un octet -- tu envoi l'octet En faisant ça tu n'as besoin de stocker qu'un byte.

Impec, je vais tester ça.

Merci pour votre aide.

Bonne journée