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

Python Discussion :

Ecrire un int entre 0 et 256, ou un hexa, l'envoyer en byte avec PySerial sur le port serie/UART, et .


Sujet :

Python

  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 Ecrire un int entre 0 et 256, ou un hexa, l'envoyer en byte avec PySerial sur le port serie/UART, et .
    Je souhaite écrire au clavier un ou plusieurs int entre 0 et 256, ou hexa, (ce qui constitue ma commande), les envoyer en byte(s) (à priori de 8 bits, 8N1) avec PySerial sur le port serie/UART via un adaptateur USB, puis récupérer une réponse sous forme de byte(s) à transcrire à l'écran en hexa.

    Au final, la commande sera envoyée par un script automatique et la réponse transcrite en valeur décimale ou booléenne lisible pour un humain, mais pour l'instant, je n'arrive pas à effectuer la première partie exposée ci-dessus.

    L'objet de la question est de pouvoir communiquer avec un thermomètre infrarouge dont la doc se trouve ici
    Il est normalement possible de paramétrer, et récupérer les données via cette communication.

    Je ne sais pas comment débugger ce que je fais dans la mesure ou je dois faire une requête puis lire la réponse alors que je n'obtiens jusqu'à maintenant rien, j'ai énormément de difficulté à y arriver. Je ne suis même pas certain de la validité et bonne réception de ma commande.

    J'ai bien trouvé ça :https://python.developpez.com/cours/...age_12#L12-A-9
    mais ça discute surtout de la façon de sauvegarder dans des fichiers et je vois qu'il y a de notables différences entre python2 et 3.

    Je ne suis pas programmeur et avoue me perdre un peu dans les encoding, les ASCII avec leur représentation en hexa.
    Il s'est avéré que quand j'envoyais 129, j'envoyais finalement 49, 50 et 57, càd 00000001, 00000010 et 00001001 au lieu de 10000001.
    J'utilisais alors la fonction int(129) de Python, mais je ne pouvais pas envoyer ser.write(int(129)) sur mon port série !

    Je ne sais absolument plus comment m'y prendre. J'ai aussi tenté d'utiliser un arduino comme "target" et aide au débugage mais sans succès !

    Y aurait-il une façon propre de faire ou des outil plus adapté que d'autres ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Citation Envoyé par hary66 Voir le message
    Y aurait-il une façon propre de faire ou des outil plus adapté que d'autres ?
    Côté Python3, transformer une liste d'entiers dans 0..256 en bytes qu'on pourra transmettre via pyserial est simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> L = [1, 2, 3]
    >>> bytes(L)
    b'\x01\x02\x03'
    Il est sûr que votre projet est beaucoup plus ambitieux mais si vous n'avez pas la patience d'apprendre à coder, on ne va pas le faire à votre place...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  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
    Citation Envoyé par wiztricks Voir le message
    Il est sûr que votre projet est beaucoup plus ambitieux mais si vous n'avez pas la patience d'apprendre à coder, on ne va pas le faire à votre place...

    - W
    Beaucoup plus ambitieux que quoi ? Est ce si ambitieux de vouloir communiquer avec ce matériel ? Je ne suis pas sur de comprendre.
    En ce qui concerne apprendre à coder, je veux bien, sauf que là, comme je 'lai dit plus haut, je ne sais pas comment m'y prendre pour débuger et débloquer mes blocages.

    Par contre, vos indications donnent quelques chose d’intéressant quand la valeur en entrée ne représente pas un caractère ASCII imprimable ! Dès que le caractère est imprimable, il est représenté par A et 1 dans l'exemple pour 65 et 49 ! ce qui est assez déroutant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> l= [1, 129, 65, 49]
    >>> s=bytes(l)
    >>> s
    b'\x01\x81A1'
    >>>
    La valeur envoyée sur le port serie/UART semble bien le byte adéquat !

    Je vais essayer d'avancer avec ça. Il faut que je vois comment faire la lecture du retour (réponse) maintenant.

    Merci.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Citation Envoyé par hary66 Voir le message
    En ce qui concerne apprendre à coder, je veux bien, sauf que là, comme je 'lai dit plus haut, je ne sais pas comment m'y prendre pour débuger et débloquer mes blocages.
    Pour savoir comment vous y prendre, il faut avoir appris. Et pour avoir appris, il faut commencer par lister les différentes compétences à acquérir, les tutos (ou autres) qui vont vous permettre de... et y avoir passé du temps.
    Dans votre cas, un minimum sur les bases de la programmation avec Python et la programmation réseau sont indispensables.

    Citation Envoyé par hary66 Voir le message
    Par contre, vos indications ne me donnent quelques chose d’intéressant que quand la valeur en entrée ne représente pas un caractère ASCII imprimable ! Dès que le caractère est imprimable, il est représenté par A et 1 dans l'exemple pour 65 et 49 ! ce qui est assez déroutant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> l= [1, 129, 65, 49]
    >>> s=bytes(l)
    >>> s
    b'\x01\x81A1'
    >>>
    C'est comme çà que Python affiche, par défaut, les chaînes de caractères.
    Si vous le découvrez, je comprends que cela soit déroutant.
    Le problème est que sans avoir pris le temps d'avoir une petite idée de ce qu'il se passe lorsque vous demander à Python d'exécuter des instructions de base, en cas de problème, vous ne saurez pas si la solution a été mal construite ou mal réalisée et dans ce cas, vous ne saurez pas distinguer les opérations à problème des autres (puisque pour vous tout est brouillardeux).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    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
    Citation Envoyé par wiztricks Voir le message
    Pour savoir comment vous y prendre, il faut avoir appris. Et pour avoir appris, il faut commencer par lister les différentes compétences à acquérir, les tutos (ou autres) qui vont vous permettre de... et y avoir passé du temps.
    Dans votre cas, un minimum sur les bases de la programmation avec Python et la programmation réseau sont indispensables.



    C'est comme çà que Python affiche, par défaut, les chaînes de caractères.
    Si vous le découvrez, je comprends que cela soit déroutant.
    Le problème est que sans avoir pris le temps d'avoir une petite idée de ce qu'il se passe lorsque vous demander à Python d'exécuter des instructions de base, en cas de problème, vous ne saurez pas si la solution a été mal construite ou mal réalisée et dans ce cas, vous ne saurez pas distinguer les opérations à problème des autres (puisque pour vous tout est brouillardeux).

    - W
    Vous avez sans doute raison, mais lire les documentations n'est que peu engageant en plus d'être souvent très difficilement compréhensibles. J'ai pris pour parti de passer rapidement à une mise en pratique au travers de petits exemples, quite à lire la documentation construite avec des termes très spécifiques après seulement.
    Mais il faut avouer que travailler autour d'un vrai projet est tout de même plus stimulant, même si souvent plus difficile d'accès.
    Et puis lire la documentation ! Laquelle quand on ne sais même pas les outils dont on a besoin ? Je vous assure, les débuts sont difficiles.

    Je percutte à l'instant qu'il y avait ceci dans la documentation que j'ai lu plus tot et indiqué dans mon post initial :
    Les octets de valeur numérique comprise entre 32 et 127 sont représentés par le caractère correspondant du code ASCII.
    Certains octets de valeur numérique inférieure à 32 sont représentés de manière conventionnelle, comme par exemple le caractère de fin de ligne.
    Les autres octets sont représentés par leur valeur hexadécimale, précédée de « \x ».

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonsoir,

    pas de chance pour vous le protocole de cet instrument n'est pas des plus simples pour débuter. Les messages ne sont pas représentés en ASCII, checksum et acknowledge et une doc minimaliste, la totale !

    Je viens de voir que le constructeur propose un logiciel d'acquisition et de réglage : http://www.optris.com/downloads-software

    et le summum de tout ils proposent même des drivers déjà tout fait : http://wiki.ros.org/optris_drivers
    mais il faut déjà bien maîtriser la programmation pour ça.

    Mais si c'est dans un objectif d'apprentissage alors le mieux pour qu'on puisse vous aider c'est commencer par nous montrer ce que vous avez déjà écrit ou des bouts de code qui bloquent dans la décommutation ou l'envoi des commandes.

  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
    Citation Envoyé par YCL-1 Voir le message
    Bonsoir,

    pas de chance pour vous le protocole de cet instrument n'est pas des plus simples pour débuter. Les messages ne sont pas représentés en ASCII, checksum et acknowledge et une doc minimaliste, la totale !
    Ca doit pas être si impossible tout de même ! Pour le checksum, je pensais m'en débarasser en intégrant chaque checksum en dur dans le code.

    Citation Envoyé par YCL-1 Voir le message
    Je viens de voir que le constructeur propose un logiciel d'acquisition et de réglage : http://www.optris.com/downloads-software
    Oui, c'est tout pour windows, c'est que pour cliquer sur des boutons, inutilisable !

    Citation Envoyé par YCL-1 Voir le message
    et le summum de tout ils proposent même des drivers déjà tout fait : http://wiki.ros.org/optris_drivers
    mais il faut déjà bien maîtriser la programmation pour ça.
    Bong sang comment avzez vous dégoté ça ? Mais à priori, ce n'est que pour la camera thermique ! Pas pour les thermomètres.

    Citation Envoyé par YCL-1 Voir le message
    Mais si c'est dans un objectif d'apprentissage alors le mieux pour qu'on puisse vous aider c'est commencer par nous montrer ce que vous avez déjà écrit ou des bouts de code qui bloquent dans la décommutation ou l'envoi des commandes.
    Pour l'instant, je n'ai rien écrit. J'essaie de faire réagir le bidule à quelque commande !
    Avec ce que vous m'avez aidé à débroussailler aujourd'hui, j'essaierai demain de voir si le thermomètre réceptionne au moins quelque chose.
    Je souhaiterais développer pour faire tourner tout ça sur une RaspberryPi. C'est pour le boulot, mais j'ai toujours les mêmes problèmes récurrents de communication de matériel et un peu de temps. Donc je souhaiterais y arriver.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Utiliser la bibliothèque PySerial pour envoyer et recevoir des bytes est très facile. Voici par exemple le premier exemple de la documentation officielle :
    Citation Envoyé par http://pyserial.readthedocs.io/en/latest/shortintro.html
    >>> import serial
    >>> ser = serial.Serial('/dev/ttyUSB0') # open serial port
    >>> print(ser.name) # check which port was really used
    >>> ser.write(b'hello') # write a string
    >>> ser.close() # close port
    Tu l'auras compris, la vraie difficulté est dans la gestion du protocole, cad quoi envoyer et quoi recevoir. Voici par exemple un code que j'ai écrit pour récupérer des trames sur une liaison série :
    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
    20
    21
        def _get_int(self):
            """Get the next byte from the serial port as an int."""
            b = self.ser.read()
            i = int.from_bytes(b, byteorder='big')
            # print(i)
            return i
     
        def _get_frame(self):
            """Get the next frame from the serial port."""
            dest = self._get_int()
            src = self._get_int()
            type = self._get_int()
     
            length = self._get_int()
            payload = list()
            while length > 0:
                d = self._get_int()
                payload.append(d)
                length -= 1
     
    return self.xbee_frame(dest, src, type, payload)
    Je savais qu'une trame était constituée ainsi :
    DEST | SRC | TYPE | LENGTH | PAYLOAD [ | PAYLOAD ...]
    J'ai pris aussi le parti de convertir en integers plutôt que de rester en bytes car le traitement derrière est plus simple.

    C'est ce genre de code que tu dois réussir à produire à partir de la documentation. Tu as une difficulté supplémentaire c'est que tu dois aussi écrire mais en regardant la documentation que tu as fournie, à la section 6, cela me semble assez simple pour beaucoup de cas. Le premier tableau avec les Read Commands me laisse penser qu'un code comme ça devrait suffire à lire la température :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import serial
    ser = serial.Serial('adresse du port')
    ser.write(1) # peut etre avec une conversion grâce à bytes()
    t1 = ser.read()
    t2 = ser.read()
    Pour ce qui est des moyens de débogage :
    • un oscilloscope
    • deux cables USB to TTL reliés entre eux
    • le débogueur de Python


    Bon courage

    PS : le logiciel du constructeur ne fait peut-être pas ce que tu veux, mais as-tu réussi à communiquer avec ton thermomètre grâce à ce logiciel

  9. #9
    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
    Citation Envoyé par Bktero Voir le message
    Utiliser la bibliothèque PySerial pour envoyer et recevoir des bytes est très facile. Voici par exemple le premier exemple de la documentation officielle :
    [QUOT=http://pyserial.readthedocs.io/en/latest/shortintro.html]>>> import serial
    >>> ser = serial.Serial('/dev/ttyUSB0') # open serial port
    >>> print(ser.name) # check which port was really used
    >>> ser.write(b'hello') # write a string
    >>> ser.close() # close port
    Oui, je commence à me débrouiller avec ça.

    Tu l'auras compris, la vraie difficulté est dans la gestion du protocole, cad quoi envoyer et quoi recevoir. Voici par exemple un code que j'ai écrit pour récupérer des trames sur une liaison série :
    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
    20
    21
        def _get_int(self):
            """Get the next byte from the serial port as an int."""
            b = self.ser.read()
            i = int.from_bytes(b, byteorder='big')
            # print(i)
            return i
     
        def _get_frame(self):
            """Get the next frame from the serial port."""
            dest = self._get_int()
            src = self._get_int()
            type = self._get_int()
     
            length = self._get_int()
            payload = list()
            while length > 0:
                d = self._get_int()
                payload.append(d)
                length -= 1
     
    return self.xbee_frame(dest, src, type, payload)
    Je savais qu'une trame était constituée ainsi :
    DEST | SRC | TYPE | LENGTH | PAYLOAD [ | PAYLOAD ...]
    J'ai pris aussi le parti de convertir en integers plutôt que de rester en bytes car le traitement derrière est plus simple.
    Désolé mais le code avec les "def _truc_(self):" j'y comprend absolument rien !

    C'est ce genre de code que tu dois réussir à produire à partir de la documentation. Tu as une difficulté supplémentaire c'est que tu dois aussi écrire mais en regardant la documentation que tu as fournie, à la section 6, cela me semble assez simple pour beaucoup de cas. Le premier tableau avec les Read Commands me laisse penser qu'un code comme ça devrait suffire à lire la température :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import serial
    ser = serial.Serial('adresse du port')
    ser.write(1) # peut etre avec une conversion grâce à bytes()
    t1 = ser.read()
    t2 = ser.read()
    Je vais voir ce que je peux faire avec ça. Jusque là, j'ai utilisé ser.readline() qui semblait mieux me convenir .

    Pour ce qui est des moyens de débogage :
    • un oscilloscope
    • deux cables USB to TTL reliés entre eux
    • le débogueur de Python
    Je n'ai pas 2 cables USB to TTL. -> Je vais voir pour en acheter un autre.
    Le débogueur Python, c'est quoi ? Un truc style Idle ou Anaconda ? Ou c'est autre chose ?


    PS : le logiciel du constructeur ne fait peut-être pas ce que tu veux, mais as-tu réussi à communiquer avec ton thermomètre grâce à ce logiciel
    Oui, sur la machine windows, j'arrive à communiquer avec le thermomètre grâce au logiciel.exe fourni.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Arf... Si tu n'y connais rien en Python c'est vrai que mon code ne peut pas trop te parler... Je vais quand même rejoindre Wiztricks quand au début il disait que tu ne pourras probablement pas faire l'économie de quelques tutos sur Python.

    ser.readline() lit une ligne jusqu'à rencontrer un caractère de fin de ligne. Or, je ne pense pas qu'il y ait de caractère de fin de ligne dans ce que tu reçois ! Je présume que cette fonction ne retourne jamais ?

    Anaconda et Idle ? Non Peut-être que tu vas te contenter de déboguer avec print() pour le moment, ça pourrait te suffire.

    C'est une bonne nouvelle, cela veut dire que les branchements sont OK !

  11. #11
    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
    Citation Envoyé par Bktero Voir le message
    Arf... Si tu n'y connais rien en Python c'est vrai que mon code ne peut pas trop te parler... Je vais quand même rejoindre Wiztricks quand au début il disait que tu ne pourras probablement pas faire l'économie de quelques tutos sur Python.
    Ah ça j'en ai fait des tuto, et j'en fais encore ! Crois moi ! Mais quand tu débutes, il faut tout ingurgiter d'un coup. Moi, ce qui me botte, c’est le microcontroleur et son interfaçage avec le monde extérieur. Je n'y connaissais rien. Je me suis donc mis à Arduino, puis à Python. Je dois avancer avec tout ça ainsi que les problème matériel et d'électronique.

    Citation Envoyé par Bktero Voir le message
    ser.readline() lit une ligne jusqu'à rencontrer un caractère de fin de ligne. Or, je ne pense pas qu'il y ait de caractère de fin de ligne dans ce que tu reçois ! Je présume que cette fonction ne retourne jamais ?
    Je ne peux dire si la fonction retourne, mais ce matin j'ai réussi à obtenir quelques résultats encourageants.


    Citation Envoyé par Bktero Voir le message
    Anaconda et Idle ? Non Peut-être que tu vas te contenter de déboguer avec print() pour le moment, ça pourrait te suffire.
    Oui, je fais beaucoup de print() pour voir ce qui se passe, en effet. Y a t-il un moyen plus efficace ?

    Citation Envoyé par Bktero Voir le message
    C'est une bonne nouvelle, cela veut dire que les branchements sont OK !
    Oui, et en plus, comme je l'ai dis juste au dessus, ce matin, j'ai pu faire une requête avec un retour de donnée depuis un bout de script Python tournant sur linux. Je dois faire pas mal de mise en forme "à la main" pour envoyer la requête, idem pour décoder la réponse, mais les résultats obtenus sont cohérents.

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hary66 Voir le message
    Ah ça j'en ai fait des tuto, et j'en fais encore ! Crois moi ! Mais quand tu débutes, il faut tout ingurgiter d'un coup. Moi, ce qui me botte, c’est le microcontroleur et son interfaçage avec le monde extérieur. Je n'y connaissais rien. Je me suis donc mis à Arduino, puis à Python. Je dois avancer avec tout ça ainsi que les problème matériel et d'électronique.
    Je te crois et je m'en doutais (j'espérais ? ) ! Ça te permettra d'améliorer ton code dans le futur même si tout ne te sert pas forcément tout de suite.


    Citation Envoyé par hary66 Voir le message
    Je ne peux dire si la fonction retourne, mais ce matin j'ai réussi à obtenir quelques résultats encourageants.
    C'est assez simple à savoir : met un print("readline terminee") après dans ton script. Si ce message s'affiche, c'est que ta fonction a retourné ; sinon, tu es bloqué dedans.


    Citation Envoyé par hary66 Voir le message
    Oui, je fais beaucoup de print() pour voir ce qui se passe, en effet. Y a t-il un moyen plus efficace ?
    Oui, l'utilisation d'un débogueur. Mais les print() restent toutefois une solution très pratique et dans ton cas sans doute suffisante.


    Citation Envoyé par hary66 Voir le message
    Oui, et en plus, comme je l'ai dis juste au dessus, ce matin, j'ai pu faire une requête avec un retour de donnée depuis un bout de script Python tournant sur linux. Je dois faire pas mal de mise en forme "à la main" pour envoyer la requête, idem pour décoder la réponse, mais les résultats obtenus sont cohérents.
    J'avais raté ça ! C'est une bonne nouvelle !

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 120
    Billets dans le blog
    47
    Par défaut
    Bonjour à tous,

    Citation Envoyé par hary66 Voir le message
    Citation Envoyé par Bktero
    ser.readline() lit une ligne jusqu'à rencontrer un caractère de fin de ligne. Or, je ne pense pas qu'il y ait de caractère de fin de ligne dans ce que tu reçois ! Je présume que cette fonction ne retourne jamais ?
    Je ne peux dire si la fonction retourne, mais ce matin j'ai réussi à obtenir quelques résultats encourageants.
    La doc est claire sur ce point :
    The protocol of the OPTRIS CT is a binary protocol. Checksum is needed for set commands but not for read commands. The protocol has no additional overhead with CR, LR or ACK bytes. This makes the communication fast. To get the current object temperature the user must send a simple 01 hexbyte and the CT will respond with the two byte temperature. To get the temperature asfloating value subtract 1000 and divide by 10.
    Protocole binaire avec en retour deux octets pour la température, point barre...

  14. #14
    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
    Citation Envoyé par f-leb Voir le message

    La doc est claire sur ce point :


    Protocole binaire avec en retour deux octets pour la température, point barre...
    En effet, mais je pense que j'ai un retour car il doit y avoir un "timeout" qui fait "l'effet" du EOL attendu ! Car j'ai bien un retour.

    Bktero disait :
    Pour ce qui est des moyens de débogage :

    un oscilloscope
    deux cables USB to TTL reliés entre eux
    le débogueur de Python
    Je me suis procuré deux cables USB to TTL reliés entre eux comme indiqué ici et en effet, c'est pas mal pour savoir ce que l'on fait !
    J'ai utilisé ce petit bout de script et la réponse renvoyée correspond bien à l'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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    from serial import Serial
    from time import sleep
     
    ser = Serial (port="/dev/ttyUSB0", baudrate=9600, timeout=1, writeTimeout=1)
     
    ser2 = Serial (port="/dev/ttyUSB1", baudrate=9600, timeout=1, writeTimeout=1)
     
    while 1:
        if ser.isOpen():
            print("")
            print ("Port ", ser.name, end="")
            print(" ouvert.")
     
        if ser2.isOpen():
            print("")
            print ("Port ", ser2.name, end="")
            print(" ouvert.")
     
     
            commande=input("entrez votre commande en hexa séparé par des points : ")
            print("nombre entré : ", commande)
            print("type(nombre) :", type(commande))
            l=commande.split(".")
            print("l=", l)
            long=len(l)
     
            for i in range(0, long):
                l[i]=int(l[i],16)
     
            print("l = ", l)
            b=bytes(l)
            print("commande en hexa : ",b)
            ser.write(b)
            while ser2.inWaiting()==False:
                a=0
            while ser2.inWaiting()==True:
                print("ser2.inWaiting : ", ser2.inWaiting)
                retour=ser2.readline()
                print ("retour : ", retour)
    envoyé : 1, reçu : b'\x01'
    envoyé : 2, reçu : b'\x02'
    envoyé : ad, reçu : b'\xad'

    Mais pour pouvoir exploiter le retour, je souhaiterais obtenir 1, 2, ou ad plutôt que les retours indiquée ci-dessus. Ou mieux, directement la valeur décimale correspondante.
    Je ne trouve pas comment !

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Citation Envoyé par hary66 Voir le message
    Mais pour pouvoir exploiter le retour, je souhaiterais obtenir 1, 2, ou ad plutôt que les retours indiquée ci-dessus. Ou mieux, directement la valeur décimale correspondante.
    Si vous travaillez avec des bytes sans trop savoir ce qu'ils sont, sur que c'est prise de tête... Pourtant les bytes sont déjà des entiers que Python se contente d'afficher, par défaut, d'une façon commode (mais pas forcément "commode" pour vous):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = b'\x01'
    >>> a[0]
    1
    >>>
    et le type de a[0] est bien un entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> type(a[0])
    <class 'int'>
    Et on peut convertir facilement une séquence de bytes en liste d'entiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> s = b'abc'
    >>> z = list(s)
    >>> z
    [97, 98, 99]
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hary66 Voir le message
    Bktero disait :
    [...]
    Je me suis procuré deux cables USB to TTL reliés entre eux comme indiqué ici et en effet, c'est pas mal pour savoir ce que l'on fait !
    J'ai utilisé ce petit bout de script et la réponse renvoyée correspond bien à l'entrée.
    T'as vu cette technique de fouine ! Ca te permet de t'assurer que tu envoies bien ce que tu penses envoyer.


    Citation Envoyé par hary66 Voir le message
    Mais pour pouvoir exploiter le retour, je souhaiterais obtenir 1, 2, ou ad plutôt que les retours indiquée ci-dessus. Ou mieux, directement la valeur décimale correspondante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = ser.read()
    i = int.from_bytes(b, byteorder='big')
    pour obtenir des integers à partir de tes bytes ?

  17. #17
    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
    Citation Envoyé par Bktero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = ser.read()
    i = int.from_bytes(b, byteorder='big')
    pour obtenir des integers à partir de tes bytes ?
    Absolument magnifique ! Sauf que je ne comprends pas ce qui se passe dans cette ligne de code !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = int.from_bytes(b, byteorder='big')
    Sinon, moi j'utilise ser.readline() car je n'arrive pas à récupérer le retour quand c'est un retour sur 2 bytes avec ser.read().

  18. #18
    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
    Puis je faire un petit UP !

  19. #19
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Citation Envoyé par hary66 Voir le message
    Puis je faire un petit UP !
    heu... et c'était quoi la question?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  20. #20
    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
    Citation Envoyé par wiztricks Voir le message
    heu... et c'était quoi la question?

    - W
    Concernant mon post #17, j'aurai souhaité quelques explications concernant ce bout de code qui était très efficace mais que je ne comprenais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = int.from_bytes(b, byteorder='big')

Discussions similaires

  1. Ecrire sur un port serie d'un PC
    Par poulp86 dans le forum Services Web
    Réponses: 0
    Dernier message: 22/04/2009, 17h35
  2. Réponses: 3
    Dernier message: 08/04/2009, 14h48
  3. Ecrire sur le port serie
    Par firejocker dans le forum C++
    Réponses: 1
    Dernier message: 24/05/2006, 13h58
  4. [TP] Code pascal pour lire sur un port série (int 14h)
    Par ebedinade dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 13/12/2005, 00h39
  5. [VB.NET] Comment ecrire du code entre <title>
    Par ykane dans le forum ASP.NET
    Réponses: 5
    Dernier message: 10/05/2004, 16h58

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