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 :

Encore en proie à des difficultés de communication sur port sériel/USB


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut Encore en proie à des difficultés de communication sur port sériel/USB
    Bonjour

    Pour communiquer avec certaines machines, j'ai une liaison RS232/USB physique entre une linux box (RPi) et les dites machines.
    Un exemple de protocole peut être trouvé dans la doc en PJ :

    Je suis quasiment certain avoir utilisé depuis un terminal une commande du style :
    ou quelque chose de très approchant pour lire ce qui m'arrivait sur ce port

    Idem pour y écrire des commandes style commandes AT depuis un autre terminal:
    Or, je n'arrive à rien lire en retour pour le moment.

    J'ai pu faire quelques tests concluant depuis le serialmonitor de l'IDE Arduino, mais je voudrais ne pas dépendre de cet IDE car je ne sais pas comment est mis en forme ce que j'envoie et comment est décodé ce qui est reçu.

    A la fin, je souhaite envoyer/recevoir des commandes/réponses depuis un script Python et cela refuse de fonctionner. Je pense qu'il y a des histoires d'encodage qui interfère dans la mise en forme correcte des messages.
    Images attachées Images attachées

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par hary66 Voir le message
    A la fin, je souhaite envoyer/recevoir des commandes/réponses depuis un script Python
    Ouais, je crois me souvenir...

    Citation Envoyé par hary66 Voir le message
    Je suis quasiment certain avoir utilisé depuis un terminal une commande du style cat < /dev/ttyUSB0 ou quelque chose de très approchant pour lire ce qui m'arrivait sur ce port
    Alors à priori ta commande est bonne (une redirection en inférieur permet de récupérer les données d'un fichier). Toutefois en lisant la doc que tu joins, le truc demande d'abord une commande avant de répondre (page 3 paragraphe 1.C "Responses are sent from the scale each time a command is received."). Donc il faut d'abord envoyer une commande avant de récupérer la réponse. Et la commande doit être je pense formatée nickel.

    De plus, là c'est pas indiqué, mais je présume que la réponse se fait sur une ligne. Or pour lire une ligne, on n'utilise pas "cat" mais "read".
    Donc au lieu d'appeler cat </dev/tyUSB0, je pense qu'il vaudrait mieux appeler read reponse </dev/tty/USB0 et ce, après lui avoir envoyé une commande.
    Par ailleurs, là encore dans la doc, je vois "Each command must end with CR LF characters.". Donc ton echo ... ne peut pas fonctionner ; enfin ne peut pas être vu comme "commande" car sous Linux, une ligne se termine par LF et non CRLF. La solution serait de convertir ce que tu envoies via "unix2dos".

    Donc pour résumer, il faudrait d'abord envoyer la commande de cette façon: echo commande |unix2dos >/dev/tty/USB0 avant de lire la réponse via read reponse </dev/tty/USB0...
    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
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Et oui, je peine vraiment pour arriver à mes fins !

    Il semble y avoir une réaction en effet avec ces nouvelles commandes.
    Cependant si je prends une commande simple "SI" qui doit renvoyer une pesée de la balance, je reçois ES qui signale que la commande n'a pas été comprise par la balance.

    Qu'y a t-il en caractère de fin de commande ?
    Si j'envoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo SI | unix2dos >/dev/tty/USB0
    , la balance dois recevoir SI\n\r pour comprendre la commande.(Each command must end with CR LF characters)
    Si elle ne comprend pas, elle renvoie ES. Et c'est ce que je reçois.

    Avec , idem, la réponse est ES !

    Un autre appareil avec lequel je communique par l'intermédiaire d'un microcontrôleur que j'ai programmé (et qui répond correctement à mes requête lors des tests avec le serialMonitor de l'IDE Arduino) me renvoie des caractères incompréhensibles ! Je suis en train de penser que c'est peut être une histoire de baud rate Je suis en 115200 avec de micro ! Peut on paramétrer le baud rate au niveau de la commande read ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hary66 Voir le message
    Si j'envoie echo SI | unix2dos >/dev/tty/USB0, la balance dois recevoir SI\n\r pour comprendre la commande.(Each command must end with CR LF characters)
    Si elle ne comprend pas, elle renvoie ES. Et c'est ce que je reçois.
    Déjà c'est pas '\n\r' mais '\r\n'. Ensuite il existe la commande "od" qui te montre ce qu'elle reçoit sous forme "dump" (pratique pour debugguer). Et enfin tu peux passer par "printf" beaucoup plus fin que "echo" => printf "%s\r\n" "SI" |od -c => 0000000 S I \r \n => printf "%s\r\n" "SI" >/dev/ttyUSB0.

    Citation Envoyé par hary66 Voir le message
    Peut on paramétrer le baud rate au niveau de la commande read ?
    Absolument pas. Ca se paramètre via "stty" qui est un outil de configuration => stty 115200 ou stty -i 115200 (la seconde ne modifie que l'input). Mais c'est un coup à te foutre en l'air ta console (après si t'es en environnement de bureau c'est pas grave, tu la fermes et tu en ouvres une nouvelle).
    Donc d'abord récupérer le speed courant via stty speed puis le modifier, lire la réponse et remettre le speed tel qu'il était.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    speed=$(stty speed)
    stty -i 115200; read reponse </dev/ttyUSB0; stty -i speed

    Citation Envoyé par hary66 Voir le message
    Cependant si je prends une commande simple "SI" qui doit renvoyer une pesée de la balance
    D'après la doc, cette commande "send" (donc pour moi "envoie") une info, elle n'est pas prévue pour demander une réponse en retour. Tu pourrais essayer "BN" qui est "donne le type de balance" et qui, là, semble donc demander un truc...
    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]

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    On peut spécifier le device à configurer avec stty --file=/dev/tty/USB0 par exemple.

    Et on peut voir déjà la config du device via stty -a --file=/dev/tty/USB0.

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ printf "%s\r\n" "SI" |od -c
    0000000   S   I  \r  \n
    0000004
    $ echo -e "SI\r" |od -c
    0000000   S   I  \r  \n
    0000004
    $ echo -en "SI\r\n" |od -c
    0000000   S   I  \r  \n
    0000004
    Tout ça, sans unix2dos.

  7. #7
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Bon, il y a vraiment des subtilités avec ces histoires de CR et LF

    En fait la doc du fabriquant indique bien : "Each command must end with CR LF characters"

    Sauf que : pour que ma balance comprenne mes commandes, je dois lui envoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s\n" "S" > /dev/ttyUSB0
    Comme vous le voyez, je dois supprimer le \r ou CR, sinon la balance me répond avec un ES qui veut dire qu'elle n'a pas compris la commande

    En clair, la commande printf "%s\r\n" "SI" > /dev/ttyUSB0 sensée être correctement mise en forme ne semble pas l'être ! Il y a semble t-il un caractère fantôme supplémentaire envoyé !

    Un soucis supplémentaire est que selon ce que j'utilise pour communiquer sur /dev/ttyUSB0, entre terminal, IDE Arduino ou mon code Python, je n'ai jamais les mêmes comportements !
    Avec Arduino par exemple, je fais fonctionner la balance et mon microcontrôleur avec le même paramétrage.
    Depuis le terminal, j'ai réussi à faire fonctionner la balance mais pas le micro, même en tripatouillant les paramètres !

Discussions similaires

  1. Encore en proie à des déboires avec git
    Par hary66 dans le forum GIT
    Réponses: 7
    Dernier message: 19/07/2018, 14h14
  2. aide sur communication sur port serie
    Par azräel dans le forum VB.NET
    Réponses: 12
    Dernier message: 19/01/2009, 09h48
  3. Synchroniser des dossiers et fichiers sur une clé USB
    Par kilian67 dans le forum Windows XP
    Réponses: 5
    Dernier message: 01/12/2008, 17h24
  4. Probleme de communication sur port serie
    Par campistrol dans le forum Matériel
    Réponses: 4
    Dernier message: 30/01/2008, 15h27
  5. Réponses: 4
    Dernier message: 19/03/2007, 09h56

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