Pour les explications, je vais commencer par la liaison Ampli (Arduino serveur) à l'Arduino côté PC (Client).
Dans ce cas bien précis, il faut considérer que le client peut requêter plusieurs amplis en même temps, et sur la même liaison série. Il faut donc éviter les conflits et les collisions. Par conséquent, c'est le client qui demande les données et le serveur (ampli) ne réponds qu'à la demande du client. Tant que l'ampli n'a pas répondu, le client ne fait pas d'autres demandes avant un temps d'expiration au bout du quel, il considérera l'ampli comme éteint.
Aussi pour éviter que le client aie une liste à requêter, et qu'il passe son temps à attendre sur des amplis éteints, il n'envoie des requêtes qu'à des amplis qui se sont manifestés par l'envoi d'un ping.
La séquence est donc la suivante.
• L'ampli s'allume, il envoie un ping au client
• Le client place l'ampli dans une liste à requêter
• Le client envoie des requête de demande de données à l'ampli
• L'ampli réponds par un envoi de données.
Si l'ampli ne reçois pas de demande de données au bout d'un certain temps, il relance des pings.
Si le client ne reçoit pas de données au bout d'un certain temps après une demande, il sort l'ampli de sa liste
Si le client a plusieurs amplis à requêter, il favorise celui le plus en retard
Tous les communications sont vérifiées avec un check sum, au cas ou un ping arrive au milieu d'un flux de données ou que la communication est mauvaise.
Le code serveur, donc à placer dans l'ampli est posté sur mon github:
https://github.com/vapkse/diagnosticdans le dossier serveur:
https://github.com/vapkse/diagnostic/blob/master/server/server.inoPour la communication série, j'ai utilisé une librairie externe EasyTransfer, et ajouté une librairie de structure que j'ai écris AmpTransfer. J'ai également utilisé une librairie externe LinkedList. Les librairies utilisées sont dans le dossier lib:
https://github.com/vapkse/diagnostic/tree/master/lib, et doivent être ajoutée à environnement de développement de l'Arduino.
Le code du serveur est assez simple, on peut voir dans loop() qu'il envoie des requêtes ping à l'allumage et en boucle si aucune demande de données n'est reçue. Et en cas de demande de données, il remplit une structure avec les valeurs mesurées et la renvoie. La structure de taille fixe est stockée dans la librairie AmpTransfer, dans le fichier AmpTRansfer.h
On peut donc ainsi envoyer sur le port série une série de valeurs mesurées ou des variables de régulation de l'ampli.
A noter également que chaque requête comporte un id d'ampli qui sera propagée jusqu'à la page web, pour permettre d'identifier d'une façon unique chaque ampli. Cette id doit être contenue dans un byte (0 à 255).
Côté Arduino client, le code doit permettre de recevoir cette structure de données et la propager au PC via le port USB. Ce code est dans le dossier client
https://github.com/vapkse/diagnostic/blob/master/client/client.inoIl s'appuie sur le même librairies que la partie serveur. Comme il est fait pour un Mega 2560, qui a plusieurs ports série, j'utilise le 0 pour la communication USB et le 1 pour la communication avec l'ampli. La encore, le programme attends des réponses de requêtes, en fonction du flux expliqué ci-dessus. Une fois les données reçues d'un ampli, elles sont pour l'instant transférées immédiatement et tel quelle sur le port série usb. Il n'y a aucune transformation, la structure c++ est envoyée au pc (Function processMessage)
A Suivre...