Bon, j'ai été imprécis dans ce que j'ai dit. Ce n'est pas un Serial.Println(), mais un Serial.write() que j'ai fait. Voilà le code.
Pour autant, ce qui m'a troublé, est l'affichage dans le moniteur série, qui se résume à 5 lignes, malgré que le compteur d'opération soit à 65, ce qui est le nombre de caractères du fichier et donc le nombre de Serial.write().
dans votre cas vous utilisez l'API read() qui renvoie un entier. Cet entier vaut -1 s'il y a erreur de lecture et si la lecture s'est bien passée, l'octet lu est dans l'octet de poids faible de cet entier.
Comme vous testez file.available(), le read() va toujours fonctionner et retourner dans son octet de poids faible le caractère lu et ça tombe bien puisque lorsqu'on passe un int à une fonctoin attendant un byte (votre Serial.write()) le compilateur extrait l'octet de poids faible.
Si vous voulez accumuler cela dans un buffer
uint8_t i = 0;
char bufferChar[100]; // assez grand
while(file.available()) {
char r = file.read(); // tronque l'entier et prend l'octet de poids faible
Serial.write(r);
bufferChar[i++] = r; // il faudrait tester qu'on ne déborde pas, j'ai la flemme là
}
bufferChar[I] = '\0'; // on termine le buffer proprement,il faudrait tester qu'on ne déborde pas, j'ai la flemme là
ou avec une String
uint8_t i = 0;
String bufferString;
while(file.available()) {
char r = file.read(); // tronque l'entier et prend l'octet de poids faible
Serial.write(r);
bufferString += r;
i++;
}
Je pense qu’il voulait dire que read retourne un int pas un byte.
Comme je l’ai expliqué ça sert à retourner soit l’octet lu, soit une valeur d’erreur (qui sera codée sur les octets supplémentaires - si ça retournait qu’un byte on ne pourrait pas savoir puisque les 256 valeurs sont possibles).
Tester déjà s’il y a quelque chose à lire et si oui vous le lisez
while (file.available() && file.read() != ',') ….
Quand vous faites un ET logique entre deux conditions le compilateur s’arrête dès qu’il connaît le résultat donc ici si on n’a rien à lire, on n’essaye pas de faire read().
Sinon je ne comprends pas pourquoi vous avez écrit cette fonction, c’est un peu la même écriture pour attendre la fin de ligne
char r;
while (file.available() && (r= file.read()) != '\n`) …. // ajouter r à la chaîne
Ou plus lisible
while(file.available()) {
char r = file.read();
if (r == '\n') break; // on sort du while, on a Lu la ligne
str[i] += r;
}
C'est vrai, j'avais mis file.available() dans mes tests pour ne tomber dans une boucle infinie, mais il effectivement plus judicieux de le mettre en premier.
Pour la deuxième boucle while, je n'avais pas trouvé de manière élégante sans employer une fonction annexe ; vous me l'avez fournie.