Pages: [1]   Go Down
Author Topic: [Résolu]Convertion Byte to String  (Read 672 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

J'ai un petit souci,

lorsque je lis les informations de mon fichier avec cette methode:
Code:
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 :
Code:
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.
« Last Edit: May 01, 2012, 09:03:50 am by guispeed4262 » Logged

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
// 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 2Ko de ram sur une carte arduino, et seulement 500 octets de libre 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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Code:
// 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) ?
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
Quelle est la taille de ton fichier ?
Ha c'est peut être pour ca que ca bug. Car mon fichier fait 2665 octect
Quote
Est-il fait de plusieurs lignes ?
oui, c'est une page Web
Quote
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 ?

Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Impec, je vais tester ça.

Merci pour votre aide.

Bonne journée
Logged

Pages: [1]   Go Up
Jump to: