68tjs:
Si le temps d'exécution de loop() est trop lent, perso (mais je ne suis pas une flèche en programmation), je n'ai pas de solution si ce n'est reprendre loop() pour l'accélérer.
On peut aussi appeler plusieurs fois dans la loop() la fonction critique qui vérifie "l'apparition de l'info" et si nécessaire en dernière mesure (pas pour du temps long) "l'apparition de l'info" pourrait générer une interruption qui pourrait dans certains cas suffire à capturer l'info pertinente (eg une roue codeuse)
68tjs:
La boucle infinie est constituée ainsi ;
while(1)
{
loop();
}
Comme la condition while(1) est toujours vérifiée il est impossible de sortir du while et donc à peine sorti de loop() le programme y re-entre.
pas tout à fait exactement cette tête là mais le concept y est:
voilà le vrai main() qui est utilisé à la compilation
en enlevant la phase d'init
int main(void)
{
setup();
// enlevé pour simplifier un peu
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
on voit que c'est une boucle for sans aucune expression (c'est pareil que le while(true)) mais qu'après l'appel de la fonction loop() si vous avez défini la fonction [url=https://www.arduino.cc/en/Tutorial/SerialEvent]SerialEvent()[/url] (et qu'il y a un caractère dispo sur le port série) alors votre fonction est appelée.
What
?! me direz vous, comment se fait-il que SerialEvent() soit appelée alors qu'on voit le code mentionner serialEventRun ?
Bonne question !
Pour les curieux serialEventRun qui semble bien mystérieux est défini dans HardwareSerial.cpp sous cette forme
void serialEventRun(void)
{
#if defined(HAVE_HWSERIAL0)
if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
#endif
#if defined(HAVE_HWSERIAL1)
if (Serial1_available && serialEvent1 && Serial1_available()) serialEvent1();
#endif
#if defined(HAVE_HWSERIAL2)
if (Serial2_available && serialEvent2 && Serial2_available()) serialEvent2();
#endif
#if defined(HAVE_HWSERIAL3)
if (Serial3_available && serialEvent3 && Serial3_available()) serialEvent3();
#endif
}
le code de cette fonction est plein de define pour vérifier ce que vous avez en port série matériel. Si vous n'en avez aucun port série dispo la fonction serialEventRun est définie à null (dans d'autres architectures) et sinon cette fonction vérifie chacun des ports série dispo et appelle la fonction serialEvent[color=red]x[/color](); en fonction de la présence où non d'un octet sur le port série
x
Tout cela pour dire qu'à la sortie de la loop() il y a un certain nombre de tests qui sont effectués et éventuellement si vous avez implémenté la fonction serialEvent() et qu'il y a un caractère reçu alors vous n'allez pas tout de suite revenir dans la loop().