Bonjour,
J'ai besoin de votre aide concernant une exclusion de retour à la ligne.
Le but de mon projet est de lire un fichier texte puis l'exploiter. Actuellement, j'ai réussi à faire cela uniquement avec une seule ligne de ce fichier texte où des données thermiques séparées par des tabulations apparaissent.
Maintenant je dois faire la même chose mais comme cette fois-ci le fichier texte contient beaucoup plus de lignes, il faudrait que je sois capable d'éliminer les 5 premières lignes qui sont uniquement le titre etc... Puis le numéro de ligne à la gauche à chaque fois pour lire le restant des données.
Comme dit précédemment j'ai déjà reçu de l'aide de la part de @kamill pour lire les données séparées par les tabulations sur une seule ligne maintenant il faut que je réussisse à faire de même mais sur un fichier complet en excluant les 5 premières lignes + le numéro de chaque ligne.
Voici mon code
#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;
String readStg;
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("IR000140.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')
verif();
//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 verif() {
Serial.println("\nLecture de la 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);
if (resultat < 81.5) { // Indiquer le caractère à rechercher
Serial.println("\nLe caractère recherché est présent dans le fichier");
}
delay(1000);
readStg = "";
}
Bon là j'arrive à lire etc sur la première ligne.
J'ai pensé à faire ça en ajouter les OU '\n'
if (c == '\t' || c=='\n')
verif();
//stock des caractères dans une chaîne
if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t' || c!='\n')
Mais ça ne marche malheureusement pas puisque je ne sais pas comment exclure les premières lignes.
Je vous met à disposition mon texte.
dans setup (ou, si on veut $être plus général, après l'ouverture du fichier)
mettre compteur à zéro
tant que ( compteur < 5 ) { (ou transformer une boucle while en for)
lire jusqu'à '\n'
incrementer compteur
}
ensuite, lire une ligne comme avant, en ignorant le '\r' (à rajouter dans le test)
while (myFile.available()) {
c = myFile.read();
if (c == '\t')
lineCount = lineCount + 1
while (lineCount < 5 ){
c == '\n'
lineCount++
}
verif();
//stock des caractères dans une chaîne
if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
{
if (c==',')
c='.';
readStg += c;
}
}
if (c == '\t')
lineCount = lineCount + 1
while (lineCount < 5 ){
c == '\n'
lineCount++;
}
ne doit pas trop compiler, et ne rendra pas ce que vous voudfrez une fois corrigé syntaxiquement
for ( uint8_t lineCount=0; lineCount <= 5;) { // il manque un champ à la boucle for; lineCount est incrémenté si necessaire après lecture char après char
char c= myFile.read();
if ('\n' == c) lineCount++;
}
a des chances de compiler, et de sauter 5 lignes (mais sera certainement affreux sur un fichier de 4 lignes: il bouclera...)
Je vois petit à petit le principe sauf que quand je l'intègre à mon programme, plus rien ne s'affiche
while (myFile.available()) {
c = myFile.read();
if (c == '\t')
verif();
for ( uint8_t lineCount=0; lineCount <= 5;) { // il manque un champ à la boucle for; lineCount est incrémenté si necessaire après lecture char après char
char c= myFile.read();
if ('\n' == c) lineCount++;
}
//stock des caractères dans une chaîne
if (c != 0 && c != (char)0xff && c != (char)0xfe && c!='\t')
{
if (c==',')
c='.';
readStg += c;
}
}
Sortie :
Communication avec la carte SD...
La communication a démarrée correctement
Non:
ça semble marcher pour un fichier; si un fichier a moins de 4 lignes, ça va boucler.... (et vous serez très ennuyé si vous reduisez le nombre de lignes dans 6 mois). Il faut rajouter un test sur la fin du fichier....
dbrion06:
Non:
ça semble marcher pour un fichier; si un fichier a moins de 4 lignes, ça va boucler.... (et vous serez très ennuyé si vous reduisez le nombre de lignes dans 6 mois). Il faut rajouter un test sur la fin du fichier....
Un test judocieux, plus judicieux que ce que je ferais avec du codage à la volée
Que ferait
if (myFile.available()) lineCount=100;
dans la boucle de comptage des fins de ligne (c'est très laid)
dbrion06:
Un test judocieux, plus judicieux que ce que je ferais avec du codage à la volée
Que ferait
if (myFile.available()) lineCount=100;
dans la boucle de comptage des fins de ligne (c'est très laid)
lineCount = 100 est donné au pif ou c'est une valeur fixe ?
Puis oui je viens d'essayé sans condition à la fin du programme avec un texte qui possède qu'une ligne et effectivement, il n'y a rien qui se passe.
Tu élimines les \r et \n
Pour ne prendre que les mesures thermiques tu testes si ta chaine contient une virgule
#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;
String readStg;
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("IR000140.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')
verif();
//stock des caractères dans une chaîne
if (c != 0 && c != (char)0xff && c != (char)0xfe && c != '\t' && c!='\r' && c!='\n')
{
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 verif() {
int index=readStg.indexOf(',');
if (index<0)
{
readStg="";
return; // il n'y a pas de virgule -> ce n'est pas une température
}
readStg.setCharAt(index,'.'); // remplace , par .
Serial.println("\nLecture de la 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);
if (resultat < 81.5) { // Indiquer le caractère à rechercher
Serial.println("\nLe caractère recherché est présent dans le fichier");
}
delay(1000);
readStg = "";
}