Bonjour,
Je travaille sur un robot, donc l'ordinateur embarqué est une Jetson Xavier AGX developper kit, tournant sur une version modifiée d'ubuntu 18.04.
A cet ordinateur est connecté via USB une carte de développement STM32 (microcontroleur, comme un Arduino en plus puissant), qui sert à lire des capteurs et qui envoie des données à 20Hz.
Coté ordinateur j'ai un code C++ qui lit les données venant de la STM32 (via /dev/ttyACM0).
Le problème est qu'au bout d'un certain temps (variable, parfois plusieurs heures), la STM32 "change" de device et devient /dev/ttyACM1, ce qui fait que je ne récupère plus les données. Je soupçonne un micro faux-contact (quand on déconnecte et reconnecte un périphérique USB, il change souvent de nom), mais sans preuve.
Je cherche donc une solution pour qu'en cas de déconnexion/reconnexion, je reçoive à nouveau mon flux de données.
Pour l'instant, j'ai trouvé comment avoir un lien symbolique ne changeant pas (/dev/ttySTM32) : j'arrive à m'y connecter (au lieu de /dev/ttyACM0), mais si je débranche et rebranche la STM32, la communication reste rompue (/dev/ttySTM32 pointe maintenant sur /dev/ttyACM1).
Pour celà, j'ai crée un fichier /etc/udev/rules.d/99-STM32.rules contenant:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", SYMLINK+="ttySTM32"
Est-ce que je suis sur la bonne piste? Si oui, est-ce que vous avez une idée comment gérer la reconnexion? (pour détecter la perte de connexion, c'est facile, il suffit de se rendre compte qu'on n'a plus reçu de messages depuis une demi seconde)
Ou est-ce que vous avez un autre moyen plus efficace d'arriver à rétablir la connexion (ou ne pas la perdre dans un premier temps)
Merci d'avance
Félix
PS : vous trouverez en pièce jointe un code (simplifié) de la classe qui gère la communication série. Le code est basé sur le tuto suivant : https://blog.mbedded.ninja/programmi...s-using-c-cpp/
PS2 : J'ai posté cette question sous linux, car il y a peut-être des solutions au niveau de linux pour garder le device ouvert malgré les reconnexions. Si vous pensez que la question est plus adaptée dans la section C++, alors n'hésitez pas à la déplacer.
Partager