Bonjour à vous!
Suite à cette discussion, j'ai besoin d'implémenter un contrôle de flux logiciel (Xon/Xoff) sur la liaison série d'une Arduino Due.
J'ai reçu la carte aujourd'hui, et ça avance. Mais je bute sur quelque chose que je ne comprends pas.
J'ai créé une classe qui permet de gérer très simplement un buffer circulaire, dont la taille est déterminée lors de la création de l'objet. Puisqu'il m'en faut dans mon projet, autant gagner du temps pour la suite.
Puis une classe liaison série qui est une version modifiée de la classe UART de l'Arduino Due, qui fait tout pareil que celle d'origine, mais ajoute en plus la possibilité de gérer le contrôle du flux. S'il est activé, à chaque réception de caractère la taille du buffer est testée, et si le seuil est dépassé un drapeau est levé afin que le caractère XOFF soit envoyé.
D'autre part, à chaque lecture d'un caractère la taille du buffer est testée également, pour envoyer XON si on passe sous le seuil correspondant.
Pour finir, j'ai créé une variante de la carte dans l'IDE, pour désactiver l'ISR lié à l'objet Serial dans el fichier variant.cpp, et ainsi pouvoir l'appliquer à celui que je veux utiliser.
En théorie c'est tout bon. En pratique, les tests que j'ai fait avec coolterm me laissent sur ma faim:
Si je désactive le flow control dans coolterm, et envoie un "gros" fichier (c'est à dire, quelques centaines de caractères), je vois apparaître à intervalle régulier les caractères correspondants (0x13 pour xoff et 0x11 pour xon). Sans surprise, puisque j'ai une pause dans ma boucle principale, et puisque le flow control est désactivé, je pers pas mal de données.
Maintenant, si j'active le flow control dans coolterm, je ne vois plus apparaître les caractères Xon et Xoff, ce qui semble normal puisque le programme doit les considérer comme des instructions, et non comme des données. Mais ça ne change rien, la totalité du fichier est envoyée sans les prendre en compte, et j'ai donc une perte de donnée là aussi.
Je joins les deux classes mentionnées ci-dessus, et le programme en question. Je joins également le fichier variant.cpp, pour la définition de l'ISR qui est désactivée.
Toute suggestion est bienvenue, je ne vois pas où peut être le problème.
Merci d'avance!
variant.cpp (22.7 KB)
circularbuffer.cpp (1.48 KB)
circularbuffer.h (1.2 KB)
serialdue.cpp (4.61 KB)
serialdue.h (2.96 KB)
SerialDue.ino (277 Bytes)