Suppression tabulation

Bonjour,
J'ai actuellement un problème concernant mon programme Arduino et j'aimerai que vous m’éclaircissez s'il vous plaît.

Le but de celui-ci est de lire une succession de valeurs décimales (séparées par des tabulations) afin de faire multiples actions comme :
-Prendre la première valeur avant la tabulation
-L'afficher
-La convertir en entier afin d'obtenir deux nombre
-Puis les retransformer en décimal.

Jusque là tout va bien, j'arrive à réaliser cela uniquement pour la première valeur mais pas pour les autres. Je pense que cela vient des tabulations et qui perturbe donc le reste de mon programme et l'affichage qui est tout décalé donc c'est pour ça je pense.
Ceci étant dit, je n'arrive pas à supprimer les tabulations donc si quelqu'un pourrait m'aider ce serait génial.

Je vous met le code à disposition : (je fais un appel de fonction un moment pour répéter à chaque fois).

#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;

String readStg, part1, part2, suppr;

void setup() {
  Serial.begin(9600);
 //Il est montré à l'écran que la communication avec le SD va commencer
  Serial.println("Communication avec la carte SD...");

  
  //Le moniteur indique si la communication a été établie correctement
  //ou il y a eu un type d'erreur.
  if (!SD.begin(4)){
    
    Serial.println("La communication a échouée");
    return;
  }
  Serial.println("La communication a démarrée correctement");
  
  
  /*                    LECTURE DE DONNÉES DANS LA MÉMOIRE SD DE ARDUINO                 */

  //Le fichier est ouvert à nouveau, cette fois pour lire les données écrites.
  myFile = SD.open("V01_1L.txt");
  
  //Si le fichier a été ouvert correctement, les données sont affichées.
  if (myFile){
    
    //Le moniteur indique les informations qui apparaîtront dans
    //test.txt
    
    //Une boucle est implémentée qui parcourt le fichier jusqu'à ce qu'il n'en trouve plus
            
            /* RECHERCHE DE LA PREMIERE DONNEE THERMIQUE */  

    while (myFile.available()) {
      c = myFile.read();
      if (c=='\t')
      part();
      //stock des caractères dans une chaîne
      if (c!=0 && c!=(char)0xff && c!=(char)0xfe) 
        readStg += c;       
    }
          /* FIN DE LA RECHERCHE */
   
      
             

//Si tout s'est bien passé, fermer le fichier pour ne pas perdre les données
    myFile.close();
  }
  
  //Au cas où il y aurait eu des problèmes pour ouvrir test.txt, celui-ci sera affiché à l'écran.
  else{
 
    Serial.println("Le fichier test.txt ne s'est pas ouvert correctement");
  }

}

void loop(){
  
}

void part(){
      while(myFile.available()){
      Serial.println("\nLecture de la première donnée thermique");
      
      Serial.println(readStg); //Affichage de la donnée
      
      delay(1000);
     
      part1 = readStg.substring(0, 2); //Prend les 2 premiers caractères
      part2 = readStg.substring(3, 4); //Prend le suivant après la virgule

    Serial.println("\nRésultat de la séparation :");
      Serial.println(part1);  //Affiche les résulats
      Serial.println(part2);


      delay(1000);

      int n1 = part1.toInt(); // Convertit en entier
      int n2 = part2.toInt();

      Serial.println("\nLes nombres entiers sont :");
      Serial.println(n1);  //Affiche le résultat final
      Serial.println(n2);

      delay(1000);
     
      Serial.println("\nRetour en décimal...");
      float  resultat = n1 + (float)n2 / 10;
      Serial.println(resultat);
      readStg="";
     break;
     
      }  
}

En sortie :

Communication avec la carte SD...
La communication a démarrée correctement

Lecture de la première donnée thermique
82,1

Résultat de la séparation :
82
1

Les nombres entiers sont :
82
1

Retour en décimal...
82.10

Lecture de la première donnée thermique
	81,9

Résultat de la séparation :
	8
,

Les nombres entiers sont :
8
0

Retour en décimal...
8.00

Donc voilà c'est à partir de 81,9 (après 81,2) que le problème de décalage commence.

Merci

PS: j'utilise un Arduino Wireless SD Shield

Si tu penses que c'est un problème de tabulation, tu peux l'éliminer ici

     if (c!=0 && c!=(char)0xff && c!=(char)0xfe && c!='\t')

kamill:
Si tu penses que c'est un problème de tabulation, tu peux l'éliminer ici

     if (c!=0 && c!=(char)0xff && c!=(char)0xfe && c!='\t')

Franchement je ne sais pas quoi te dire, ça marche nickel.
Merci beaucoup !

Si ton but est de lire des flottants, tu peux simplifier ton programme en remplaçant la virgule par un point et en utilisant atof().

#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;

String readStg, part1, part2, suppr;

void setup() {
  Serial.begin(9600);
  //Il est montré à l'écran que la communication avec le SD va commencer
  Serial.println("Communication avec la carte SD...");

  //Le moniteur indique si la communication a été établie correctement
  //ou il y a eu un type d'erreur.
  if (!SD.begin(4)) {
    Serial.println("La communication a échouée");
    return;
  }
  Serial.println("La communication a démarrée correctement");

  /*                    LECTURE DE DONNÉES DANS LA MÉMOIRE SD DE ARDUINO                 */

  //Le fichier est ouvert à nouveau, cette fois pour lire les données écrites.
  myFile = SD.open("V01_1L.txt");

  //Si le fichier a été ouvert correctement, les données sont affichées.
  if (myFile) {

    //Le moniteur indique les informations qui apparaîtront dans
    //test.txt

    //Une boucle est implémentée qui parcourt le fichier jusqu'à ce qu'il n'en trouve plus

    /* RECHERCHE DE LA PREMIERE DONNEE THERMIQUE */

    while (myFile.available()) {
      c = myFile.read();
      if (c == '\t')
        part();
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
      {
        if (c==',')
          c='.';
        readStg += c;
      }
    }
    /* FIN DE LA RECHERCHE */

    //Si tout s'est bien passé, fermer le fichier pour ne pas perdre les données
    myFile.close();
  }

  //Au cas où il y aurait eu des problèmes pour ouvrir test.txt, celui-ci sera affiché à l'écran.
  else {

    Serial.println("Le fichier test.txt ne s'est pas ouvert correctement");
  }
}

void loop() {
}

void part() {
    Serial.println("\nLecture de la première donnée thermique");
    Serial.println(readStg); //Affichage de la donnée

    float  resultat = atof(readStg.c_str());
    Serial.println("\nRetour en décimal...");
    Serial.println(resultat);

    delay(1000);

    readStg = "";
}

kamill:
Si ton but est de lire des flottants, tu peux simplifier ton programme en remplaçant la virgule par un point et en utilisant atof().

#include <SPI.h>

#include <SD.h>
#include <String.h>
File myFile;
char c;

String readStg, part1, part2, suppr;

void setup() {
  Serial.begin(9600);
  //Il est montré à l'écran que la communication avec le SD va commencer
  Serial.println("Communication avec la carte SD...");

//Le moniteur indique si la communication a été établie correctement
  //ou il y a eu un type d'erreur.
  if (!SD.begin(4)) {
    Serial.println("La communication a échouée");
    return;
  }
  Serial.println("La communication a démarrée correctement");

/*                    LECTURE DE DONNÉES DANS LA MÉMOIRE SD DE ARDUINO                */

//Le fichier est ouvert à nouveau, cette fois pour lire les données écrites.
  myFile = SD.open("V01_1L.txt");

//Si le fichier a été ouvert correctement, les données sont affichées.
  if (myFile) {

//Le moniteur indique les informations qui apparaîtront dans
    //test.txt

//Une boucle est implémentée qui parcourt le fichier jusqu'à ce qu'il n'en trouve plus

/* RECHERCHE DE LA PREMIERE DONNEE THERMIQUE */

while (myFile.available()) {
      c = myFile.read();
      if (c == '\t')
        part();
      //stock des caractères dans une chaîne
      if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
      {
        if (c==',')
          c='.';
        readStg += c;
      }
    }
    /* FIN DE LA RECHERCHE */

//Si tout s'est bien passé, fermer le fichier pour ne pas perdre les données
    myFile.close();
  }

//Au cas où il y aurait eu des problèmes pour ouvrir test.txt, celui-ci sera affiché à l'écran.
  else {

Serial.println("Le fichier test.txt ne s'est pas ouvert correctement");
  }
}

void loop() {
}

void part() {
    Serial.println("\nLecture de la première donnée thermique");
    Serial.println(readStg); //Affichage de la donnée

float  resultat = atof(readStg.c_str());
    Serial.println("\nRetour en décimal...");
    Serial.println(resultat);

delay(1000);

readStg = "";
}

C'est vrai que c'est beaucoup plus léger et intéressant, de plus, si admettons dans le fichier texte il y a une valeur du type 101,2 ce sera plus simple de la transformer en flottant comme ça que dans le programme précédent avec les substring etc.

Merci énormément @kamiil !

Edit :

if (c==',')
          c='.';

Pourriez-vous m'expliquer ce que teste cette condition s'il vous plaît ?

float  resultat = atof(readStg.c_str());
    Serial.println("\nRetour en décimal...");
    Serial.println(resultat);

Juste, le c_str c'est quoi ? Cela fait partie de la fonction atof ?

Merci

Taftaf55:
Pourriez-vous m'expliquer ce que teste cette condition s'il vous plaît ?

Teste si le caractère est une virgule et si oui, remplace par un point

Taftaf55:
Juste, le c_str c'est quoi ? Cela fait partie de la fonction atof ?

atof() travaille sur des string C (cstring), c_str() transforme une String en cstring

kamill:
Teste si le caractère est une virgule et si oui, remplace par un point
atof() travaille sur des string C (cstring), c_str() transforme une String en cstring

Merci bien! ^^