Problème avec la librairie FileIO pour l'écriture sur carte SD

Bonjour à tous,
Je me permets ce petit post car j’ai un problème avec un de mes programmes Arduino. Je cherche tout simplement à utiliser l’arduino Yun pour écrire sur une carte SD.
Le problème est que je cherche à définir mon fichier en variable globale et qu’il m’est impossible de le faire car j’ai un message d’erreur lors de la compilation. Voila le programme qui ne bug pas :

#include <FileIO.h>

void setup() {

Bridge.begin();

Serial.begin(9600);
while(!Serial);

Serial.println(“File write example”);

if (!FileSystem.begin()) {
Serial.println(“Init Failed !”);
}

File file = FileSystem.open("/mnt/sda1/test.txt", FILE_WRITE);

if (!file) {
Serial.println(“Open Failed !”);
}
file.print(“test!”);
file.close();

}
void loop () {

}

Le problème c’est que dès que je cherche à définir le “File file” juste en dessous des librairies et non dans le setup, ça bug. Si je met un file.print ou autre dans la boucle loop avec ce programme, on me dit que la variable file n’est pas définie.
Avez-vous des suggestions ?
Encore merci pour votre aide.

A priori comme ça je dirais que tu cherches à utiliser l'objet FileSystem avant de l'avoir initialisé.
Les Objets globaux sont créés en tout début de programme, avant que ta fonction setup() soit exécutée.

En réfléchissant un peu, il y a quand même un problème.

En C++, tout objet créé sur la pile dans un bloc de programme ( c-àd entre { et } ) est détruit à la sortie du bloc. Donc un objet File créé dans la fonction setup() sera détruit à sa sortie. Pareil pour la fonction loop().

Si on veut garder ce fichier ouvert, pour l'exploiter continument dans la fonction loop() :

  • il y a la solution de (re)créer l'objet File à chaque passage dans loop(). C'est un peu lourd, non ?
  • ou bien on peut créer un objet File par
File* fichier = new File ( le_nom, le_ mode );

dans le setup(), en conservant le pointeur File* dans une variable globale.

J'ai regardé, dans le librairie Bridge, le code de FileSystem::open() :

File FileSystemClass::open(const char *filename, uint8_t mode) {
  return File(filename, mode);
}

Donc pas de mystère, on peut créer un File directement sans demander à l'objet FileSystem.

Se pose quand même la question de la fermeture du fichier, pour le cas ou serait implémentée une écriture différée. Est-ce le cas ? La fonction File::flush() est vide, j'en déduis qu'elle est inutile et donc que chaque écriture sur fichier est immédiate.

J'ai bon, là?