Bonjour tous le monde,
J’utilise une liaison série ente un Uno et Un mega.
J’arrive à envoyer ou recevoir des messages, mais les cartes ne sont pas synchro, je me suis donc dit et si j’utilisé les interruptions? et encore mieux et si mon Rx SoftSerial était raccordé sur une de ces pin?
Je me suis donc lancé mais la seul chose que j’arrive à faire, c’est recréer ‘SerialAviable’. Je voudrai que dans la routine il lise les données en réception.
il ne faut pas mettre Serial.println ou Serial1.readStringUntil dans une interruption
ça ne va pas marcher car une interruption par défaut n'est pas interruptible, millis ne fonctionne pas par exemple et readStringUntil dépend de millis pour le timeout
votre ISR ne devrait que lever un drapeau et vous traiter ensuite cela dans la boucle.
(mais je ne comprends pas pourquoi vous avez besoin d'interruption pour lire le port série.. il y a un buffer automatique pour cela au niveau matériel et quand votre boucle revient au début, il suffit de regarder s'il y a quelque chose de dispo avec Serial.available(). Faut juste que la boucle ne bloque pas trop longtemps.
C’est là le problème la boucle doit mettre trop longtemps parce que régulièrement je trouve le buffer vide ou alors je trouve plusieurs messages.
Autre chose les deux codes ne sont pas synchronisés c’est un peu mon idée avec les interruption de faire une synchronisation.
Comme ça j’écoute uniquement quand j’envoie.
Pour le code test,
J’ai mis de delay (simulation charge du code final) du coup, je ne suis plus synchro, le buffer se charge et les réponses sont inattendue. Je cherche à faire une synchro non bloquante.
le MEGA c'est lequel? Sur une MEGA Serial1 existe, c'est un port série hardware, autant l'utiliser Plutôt que software serial
Vous êtes un peu agressif avec votre timing; ce n'est pas parce que la première fois que vous appelez receve() (en anglais ça s'écrit receive si vous voulez être correct) et qu'il n'y a rien dans le buffer que ça veut dire que ça ne marche pas. Vous avez mis la liaison à 9600 bauds, moins de 1000 caractere par seconde, votre arduino va passer plusieurs centaines de fois dans la boucle en attendant un caractere tellement il va plus vite que votre port série
S'il n'y a rien en attente, pas grave, revenez voir plus tard
Sinon vaut mieux la classe String et gérer vous même des buffers (tableau de caracteres)
Bonsoir,
J'ai toujours eu des différents avec l'orthographe mais je le vie bien... (humour)
En fait sur le MEGA, j'utilise bien le Serial1. Je n'ai peut être pas bien expliqué, mais je construit une centrale d'alarme et un digicode. Les 2 communiquent via ce port série (bidirectionnel). Les 2 fonctions sont donc identique dans les 2 arduino. Ce que je voudrai, c'est que le dialogue ne soit plus anarchique mais synchronisé entre les 2 de sorte d'une part être certain que le message soit reçu, d'autre part déceler au plus vite une perte de liaison pour appeler la cavalerie.
Pour les buffers, je trouvais que j'avais trop de ligne de code.