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

Shell et commandes GNU Discussion :

ttyUSB0 dans variable


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut ttyUSB0 dans variable
    Bonjour

    Je me tourne vers la communauté après beaucoup de recherches sans succès

    Quand je fais un je reçois ( d'un capteur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Courant = xx,yyA
    Puissance= xx,yyW
    Je souhaiterais mettre ces deux valeurs dans deux variables pour les traiter par la suite.
    J'ai voulu faire un cat puis grep .. je me suis fait tuer par Google ...


    Si vous avez des idées ou conseil je suis preneur, je pensais faire un petit programme en 10 minutes
    J'y suis depuis 2 jours sans succès ...

    Merci par avance

    Arnaud
    Dernière modification par N_BaH ; 28/09/2022 à 23h06.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par nonobike Voir le message
    Je souhaiterais mettre ces deux valeurs dans deux variables pour les traiter par la suite.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3</dev/ttyUSB0
    read courant 0<&3
    read puissance 0<&3

    Citation Envoyé par nonobike Voir le message
    J'ai voulu faire un cat puis grep .. je me suis fait tuer par Google ...
    Pas que Google. Ose écrire un truc style cat fic |grep motif dans ce forum et tu te feras tuer par tout le monde (grep motif fic)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 650
    Par défaut
    Tremblez mécréants !
    si vous ne savez pas ce qu'est un UUOC, je vous exécuterai en ligne de commandes.


    `même pas vrai.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3</dev/ttyUSB0
    read courant 0<&3
    read puissance 0<&3
    Est-il nécessaire de passer par un 3< ?

    Peut-on faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read courant </dev/ttyUSB0
    read puissance </dev/ttyUSB0
    En tout cas, chez moi, ça semble marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read a < /dev/ttys001
    coucou    # <- tapé par moi
    $ echo $a
    coucou    # <- affiché par echo

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 650
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ exec 3< <(printf '%s\n' abc def\ ghi)
    $ read -d '' -u 3 d e #un seul read
    $ echo "$e"; echo "$d"
    def ghi
    abc
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 255
    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 : 18 255
    Par défaut
    UUOC : Useless Use Of Cat

    Tu pourras arriver à tes fins avec cat et autres commandes, mais le code donné par Sver/NbaH sera plus efficace.

    Alors pourquoi on parle de UUOC ?

    cat signifie catenate, synonyme de concatenate. La commande sert à concaténer (mettre bout à bout) les fichiers passés en paramètre et d'afficher le résultat sur la sortie standard.
    L'usage le plus connu de cat est d'afficher le contenu d'un fichier, mais ce n'est pas l'usage pour lequel la commande est prévue.
    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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci de vos réponse aussi rapide


    voici mon entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    pi@PI2:~ $ cat /dev/ttyUSB0
     
    Courant : 3.32 A
     
    Puissance : 764.15 W
     
     
    Courant : 1.41 A
     
    Puissance : 323.67 W
     
     
     
    Courant : 1.42 A
     
    Puissance : 326.10 W
     
    ^C
    pi@PI2:~ $
    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    exec 3</dev/ttyUSB0
    read Courant 0<&3
    read Puissance  0<&3
     
     
    echo courant = "${Courant}"
    j’obtiens courant = XX,YY

    Merci beaucoup

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Est-il nécessaire de passer par un 3< ?

    Peut-on faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read courant </dev/ttyUSB0
    read puissance </dev/ttyUSB0
    En tout cas, chez moi, ça semble marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read a < /dev/ttys001
    coucou    # <- tapé par moi
    $ echo $a
    coucou    # <- affiché par echo
    il faut forcement ajouter 0<&3 sinon sa ne fonctionne pas

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Est-il nécessaire de passer par un 3< ?
    Oui, afin d'avoir un canal spécial dont la particularité est qu'il se vide au fur et à mesure que tu le lis. Son fichier contient 2 infos, il faut que chaque read lise chaque info.

    Après tu peux aussi regrouper les read...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    	read courant
    	read puissance
    } </dev/ttyUSB0
    Dans ce cas, l'important c'est que tu ne peux pas t'arrêter de lire entre temps sinon à la lecture suivante tu repars du début du fichier.

    Sinon tu peux faire du grep en rafale...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    courant="$(grep "^Courant=" /dev/ttyUSB0)"
    puissance="$(grep "^Puissance=" /dev/ttyUSB0)"
    ... mais ça c'est franchement ce qu'il y a de pire (tu lis tout le fichier à chaque fois, et si le fichier contient n répétitions d'infos tu obtiens au final le tout en vrac)

    Citation Envoyé par jack-ft Voir le message
    En tout cas, chez moi, ça semble marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read a < /dev/ttys001
    coucou    # <- tapé par moi
    $ echo $a
    coucou    # <- affiché par echo
    Ben oui, mais ton fichier ne contient qu'une ligne

    Citation Envoyé par nonobike Voir le message
    il faut forcement ajouter 0<&3 sinon ça ne fonctionne pas
    Voyez-moi ce pseudo-professeur. Il cherche pendant 2 jours un truc qui prend 2 mn puis il vient faire le mec blasé. Et tu peux expliquer pourquoi cela (si tu ne sais pas écrire "ça" tu remplaces par "cela") ne fonctionne pas sans 0<&3?
    Il ne suffit pas de dire les choses, encore faut-il dire pourquoi.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Le pourquoi, on ne le connaît pas. On ne sait pas ce qu'il veut faire de son flux. Je vais faire le rabat-joie : le flux est déjà bien formaté. Récupérer dans une variable ne sert à rien. Surtout si c'est pour faire un fichier de mesures. Un bon vieux sed est suffisant.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Le pourquoi, on ne le connaît pas. On ne sait pas ce qu'il veut faire de son flux.
    Tu n'as pas bien suivi. jack-ft dit "on peut faire sans 3<". Il lui répond "non il faut forcément cette syntaxe sinon ça ne fonctionne pas" sans dire pourquoi il le faut ou pourquoi ça ne fonctionne pas sans ; ce qui en réalité n'est donc ni une réponse ni une explication.
    Donc le pourquoi ça ne fonctionne pas sans cette instruction on le connait (et je l'ai expliqué): si tu lis simplement le flux via read v 0<fic tu lis et relis à chaque fois la même première ligne du fichier. D'où nécessité de créer un canal spécifique (ici 3) contenant au départ tout le fichier puis qui se vide au fur et à mesure que tu le lis.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 346
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Sinon tu peux faire du grep en rafale...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    courant="$(grep "^Courant=" /dev/ttyUSB0)"
    puissance="$(grep "^Puissance=" /dev/ttyUSB0)"
    Si le format est vraiment comme ça, je ne peux pas vérifier la sortie, au lieu de la création d'un flux, on pourrait peut-être juste sourcer le fichier et les variables Courant et Puissance serait configurées, non ?

    PS: de toute façon, le format a changé et donc la version grep tel quel ne fonctionne plus non plus...

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    on pourrait peut-être juste sourcer le fichier et les variables Courant et Puissance serait configurées, non ?
    Ah super bien vu
    Malheureusement ça ne fonctionnera pas car la syntaxe n'est pas correcte pour le shell (interdit de mettre un espace avant le "=" dans une affectation de variable et son fichier est écrit Courant = xx,yyA) mais je salue l'idée
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui, afin d'avoir un canal spécial dont la particularité est qu'il se vide au fur et à mesure que tu le lis. Son fichier contient 2 infos, il faut que chaque read lise chaque info.

    Après tu peux aussi regrouper les read...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    	read courant
    	read puissance
    } </dev/ttyUSB0
    Dans ce cas, l'important c'est que tu ne peux pas t'arrêter de lire entre temps sinon à la lecture suivante tu repars du début du fichier.
    Je pense que je comprends.

    En fait, je croyais que tous les /dev/tty* (du moins, ceux dont les droits commencent par un "c", comme "crw-rw-rw") étaient des "canaux spéciaux", comme le tty courant:
    si je fais un read sur le tty courant, par exemple, et qu'il n'y a pas de "production" de données, le read se met en attente jusqu'à ce que je tape une ligne suivie d'un return.
    Cette ligne est "vidée" du buffer du tty et le prochain read lit la suite, il ne relit pas la ligne précédente.

    Évidemment, si on ne me dit pas tout et que /dev/ttyUSB0 est un fichier "normal" qui "n'avance pas" quand on lit dedans, forcément, à moins de lire en séquence continue avec les accolades, ça va beaucoup moins bien marcher...

    Du coup, s'il y a plusieurs groupes d'infos à lire, comme cela semble être le cas dans le post #7, il serait peut-être judicieux soit de parser le fichier avec un awk, soit de faire une boucle en shell, avec quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while read courant && read puissance; do
        # faire ce qu'on veut avec $courant et $puissance
        courant=${courant#*:}
        puissance=${puissance#*:}
        echo "courant: $courant puissance: $puissance"
    done < /dev/ttyUSB0
    Et là, si je ne m'abuse, le "3<" n'est plus aussi indispensable...

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Je pense que je comprends.
    Whaou

    Citation Envoyé par jack-ft Voir le message
    Évidemment, si on ne me dit pas tout et que /dev/ttyUSB0 est un fichier "normal" qui "n'avance pas" quand on lit dedans, forcément, à moins de lire en séquence continue avec les accolades, ça va beaucoup moins bien marcher...
    Pour tout te dire, je pense aussi comme toi. En effet, /dev/ttyUSB0 n'est pas un fichier "normal" (le terme exact est "régulier") car les fichiers de /dev ne sont que des références à des drivers IO. Donc il y a fort à parier que /dev/ttyUSB0 se comportera comme tu le décris.
    Toutefois, "et si" ce n'était pas le cas, alors ma méthode (ainsi que la tienne que tu viens de poster) fonctionnera. Et si c'est quand-même le cas, ben... elle fonctionnera tout autant.
    Donc...

    Citation Envoyé par jack-ft Voir le message
    Et là, si je ne m'abuse, le "3<" n'est plus aussi indispensable...
    Ben là non puisque tu boucles en lecture directe sur /dev/ttyUSB0. Il y a souvent plusieurs façons d'y arriver sous Unix. Perso j'aime bien cette technique de "canal relié à un fichier" car elle permet de lire et écrire sur le même fichier sans passer par un fichier temporaire
    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo "Hello" >toto				# Pour créer un fichier d'exemple
    exec 3<toto
    rm -f toto					# Malheureusement obligatoire (et donc pas sans danger !!!)
    tr '[:lower:]' '[:upper:]' 0<&3 >toto		# Réécrit un fichier neuf à partir des datas de ce même fichier
    Le seul danger, c'est la phase "rm -f" qui est obligatoire sinon la redirection vide le fichier (et par ricochet le canal qui lui est relié). Donc la suppression "détache" le fichier du canal qui reste alors la seule mémoire du fichier d'origine. Hélas si le code crashe à ce moment là...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. parenthèses dans variable
    Par SNITON dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2005, 17h52
  2. Réponses: 12
    Dernier message: 12/10/2005, 14h34
  3. Réponses: 3
    Dernier message: 24/02/2005, 15h48
  4. resultat requete SQL d'un select dans variable vb
    Par seb_06 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 11/10/2004, 16h29
  5. Récupérer l'adresse IP du serveur dans variable ?
    Par ZERS dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/09/2004, 15h30

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