Bonjour,
Je suis en train de découvrir le monde de l'ESP et ces capacités et dans ma recherche j'ai créer un Webserver avec les fichiers web enregistrés dans la partie SPIFFS de l'ESP32. Jusque la tout va très bien ! J'ai également réussi a adapter un shields carte SD dans le but d'avoir des fichiers de config fourni par l'utilisateur. Mon problème arrive ici ! J'ai donc fait un test d'ouverture d'un fichier .txt lors du "setting" de la carte avec affichage dans le moniteur série. Cela fonctionne parfaitement. maintenant quand j'appel la même fonction de mon code via un clique sur un bouton sur le serveur web, l'ESP rentre dans une boucle infini jusqu'a faire un reset ...
Voici mes morceaux de code :
void setup() {
[...]
// Initialize SD card
Serial.println("####--SD PART--#####");
SD.begin(SD_CS);
if(!SD.begin(SD_CS)) {
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE) {
Serial.println("No SD card attached");
return;
}
Serial.println("Initializing SD card...");
if (!SD.begin(SD_CS)) {
Serial.println("ERROR - SD card initialization failed!");
return; // init failed
}
[...]
GetAcc();
[...]
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
String inputMessage;
String inputParam;
if (request->hasParam(PARAM_INPUT_1)) {
inputMessage = request->getParam(PARAM_INPUT_1)->value();
inputParam = PARAM_INPUT_1;
if (inputMessage == "ACC"){
GetAcc();
}
}
[...]
}
//La fonction GetAcc() :
void GetAcc()
{
Serial.println("Read ACC.txt :");
myACC = SD.open("/ACC.txt");
if (myACC) {
Serial.println("Read ACC.txt line by line:");
while (myACC.available()) {
buffer = myACC.readStringUntil('\n');
Serial.println(buffer);
}
myACC.close();
} else {
Serial.println("error opening ACC.txt");
}
}
Donc lors du démarrage de la carte, j'ai bien l'intégralité de mon fichiers qui est chargé dans le moniteur série mais lorsque que le serveur local envoi ACC le programme lance la fonction GetAcc() mais celle ci fait défaut et ceci arrive dans le moniteur :
Read ACC.txt :
Read ACC.txt line by line:
[...BEAUCOUP BEAUCOUP de retour à la ligne !...]
E (31881) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (31881) task_wdt
: - async_tcp (CPU 0/1)
E (31881) task_wdt: Tasks currently running:
E (31881) task_wdt: CPU 0: IDL
E0
E (31881) task_wdt: CPU 1: async_tcp
E (31881) task_wdt: Abort
ng.
abort() was called
t PC
0x400ec1eb on core 0
Backtrace: 0x4008f8c4:0x3ffbe170 0x4008faf5:0x3ffbe190 0x400ec1eb:0x3ffbe1b0 0x40087ead:0x3ffbe1d0 0x40160ac3:0x3ffbc140 0x400ed59f:0x3ffbc160 0x4008d7cd:0x3ffbc180 0x4008bfd9:0x3ffbc1a0
Rebooting...
ets Jun 8 2016 00:22:57
Je ne vois pas d'où viens le problème si un coup ça fonction et un coup ça ne fonctionne pas ...
merci pour votre aide
Flyer-74
Bonjour
Je ne vois pas d'où viens le problème si un coup ça fonction et un coup ça ne fonctionne pas ...
si je comprend bien 'le coup ou ça ne fonctionne pas' est celui ou l'appel de GetAcc() est fait depuis server.on()
Ce n'est pas anodin Que se passe-il si au lieu d'appeler GetAcc() depuis server.on tu te contentes d'y lever un drapeau et de traiter la demande ailleurs .... à un endroit ou GetAcc() passe sans conflit ?
Ceci afin de ne pas encombrer/ralentir server.on() d'autant plus qu'il 'y a sans doute pas urgence à lire tout de suite la carte SD.
Sinon pour tenter de comprendre le conflit :
E (31881) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (31881) task_wdt
: - async_tcp (CPU 0/1)
E (31881) task_wdt: Tasks currently running:
E (31881) task_wdt: CPU 0: IDL
E0
E (31881) task_wdt: CPU 1: async_tcp
E (31881) task_wdt: Abort
ng.
abort() was called
Le message d'erreur montre un incident au niveau du multitâche (RTOS) qui n'a pu fonctionner correctement ce qui a déclenché le chien de garde. Il semble que la tâche c'est la tâche asynctcp (tournant sur le processeur 1) qui a flanché
-
Avec Core debug level = verbose dans l'IDE Arduino des infos complémentaires apparaîtront peut être à l'exécution.
-
la partie backtrace:........... peut être exploitée par un utilitaire pour en savoir plus sur les fonctions en jeu au moment du problème : GitHub - me-no-dev/EspExceptionDecoder: Exception Stack Trace Decoder for ESP8266 and ESP32
ça permettra peut être d'entrer dans le détail de l'exécution de GetAcc()
S'il s'agit seulement d'afficher le contenu d'un fichier dans la console, ceci est suffisant
while (myACC.available()) Serial.print(myACC.read());
al1fch:
Bonjour
si je comprend bien 'le coup ou ça ne fonctionne pas' est celui ou l'appel de GetAcc() est fait depuis server.on()
Ce n'est pas anodin Que se passe-il si au lieu d'appeler GetAcc() depuis server.on tu te contentes d'y lever un drapeau et de traiter la demande ailleurs .... à un endroit ou GetAcc() passe sans conflit ?
Ceci afin de ne pas encombrer/ralentir server.on() d'autant plus qu'il 'y a sans doute pas urgence à lire tout de suite la carte SD.
C'est bien cela alors dans un premier temps j'ai relié un bouton poussoir sur mon ESP 32 et lors de la pression je fait appel à GetAcc(), ici tout se passe dans le 'LOOP' mais je rentre encore dans une boucle infinie sans avoir le watchdog ... bref pas gagné avec cette méthode, le seul endroit ou fonctionne le code c'est lors du premier chargement dans le 'SETTING' il doit bien y avoir la possibilité de gérer les informations d'une cartes SD dans le loop non ?
al1fch:
- Avec
Core debug level = verbose dans l'IDE Arduino des infos complémentaires apparaîtront peut être à l'exécution.
Avec Verbose j'obtiens quelque petites lignes supplémentaires pour le debug lors de la demande via le serveur :
Read ACC.txt :
Read ACC.txt line by line:
[W][sd_diskio.cpp:137] sdCommand(): no token received
[W][sd_diskio.cpp:137] sdCommand(): no token received
[W][sd_diskio.cpp:137] sdCommand(): no token received
[....PLEIN DE RETOUR A LA LIGNE.....]
E (45340) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (45340) task_wdt: - async_tcp (CPU 0/1)
E (45340) task_wdt: Tasks currently running:
E (45340) task_wdt: CPU 0: IDLE0
E (45340) task_wdt: CPU 1:
sync_tcp
E (45340) task_wdt: Aborting.
abort() was called at PC 0x400ed543 on core 0
Backtrace: 0x4008f97c:0x3ffbe170 0x4008fbad:0x3ffbe190 0x400ed543:0x3ffbe1b0 0x40087f65:0x3ffbe1d0 0x40161e7f:0x3ffbc140 0x400ee8f7:0x3ffbc160 0x4008d885:0x3ffbc180 0x4008c091:0x3ffbc1a0
Rebooting...
ets Jun 8 2016 00:22:57
Voilà je n'arrive pas à comprendre le problème si même dans le loop j'arrive pas a avoir accès à la carte SD ...
lesept:
S'il s'agit seulement d'afficher le contenu d'un fichier dans la console, ceci est suffisant
while (myACC.available()) Serial.print(myACC.read());
Pour le moment je teste jute l'affichage dans le moniteur mais par la suite j'aurais besoin de stocker ces valeurs pour les envoyer à l'utilisateur sur le serveur.
Néanmoins cela ne fonctionne pas plus que mon code déjà en place ...
Flyer-74