IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[C++] gérer la reconnection d'un device serie via USB


Sujet :

Linux

  1. #1
    Candidat au Club
    Homme Profil pro
    ingénieur robotique
    Inscrit en
    Avril 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur robotique

    Informations forums :
    Inscription : Avril 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [C++] gérer la reconnection d'un device serie via USB
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Fichiers attachés Fichiers attachés

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 351
    Points : 42 822
    Points
    42 822
    Par défaut
    Je regarderais plutôt du coté de udev pour forcer ton périphérique à toujours utiliser le même device. J'ai jamais fait mais en gros le principe, c'est que tu créée une règle qui lie ton device à un identifiant USB, donc dans ton cas celui de ton adaptateur.
    Attention, en cas de changement d'adaptateur, il faudra refaire le truc. Ca reste automatisable en faisant un script/programme qui scanne tous les composants USB, et les filtre selon leur classe.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Candidat au Club
    Homme Profil pro
    ingénieur robotique
    Inscrit en
    Avril 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur robotique

    Informations forums :
    Inscription : Avril 2021
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    et merci.

    C'est ce que j'avais essayé de faire en rajoutant ma règle udev :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", SYMLINK+="ttySTM32"
    NB : elle n'est pas très spécifique, mais tant que j'ai une seule STM32, ça devrait aller.
    J'obtiens un lien symbolique, nommé "/dev/ttySTM32", qui pointe initialement sur /dev/ttyACM0 et qui, une fois la STM32 débranchée et rebranchée pointe sur /dev/ttyACM1.
    Le problème, c'est que malgré tout, quand je déconnecte et reconnecte la STM32, la connexion est interrompue et ne reprends pas (probablement normal, vu que le "fichier" sous-jacent change.

    Du coup, si je pars sur cette solution, il manque la seconde étape, à savoir se reconnecter depuis le code c++ en cas de déconnexion. Et c'est là que je bloque.

    L'alternative serait de ne pas avoir un lien symbolique, mais de garder le même fichier "en dur" : est-ce que tu sais si c'est faisable depuis udev?

    Merci d'avance
    Félix

Discussions similaires

  1. [WD22] Modbus serie (via USB) en mode RTU
    Par Jon Shannow dans le forum WinDev
    Réponses: 7
    Dernier message: 21/05/2019, 18h22
  2. numero de serie clef USB
    Par nonolerobot dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/08/2006, 21h57
  3. N° Serie Cle Usb
    Par kivoch dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 01/05/2006, 22h39
  4. connection avec port // ou serie ou usb
    Par matterazzo dans le forum Langage
    Réponses: 1
    Dernier message: 09/10/2005, 15h16
  5. Réponses: 1
    Dernier message: 08/10/2005, 00h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo