[RESOLU] Envoi de trames Hexa via port RS232
Modérateurs : Francois, Manfraid
[RESOLU] Envoi de trames Hexa via port RS232
Bonjour à tous,
Apres avoir parcouru plusieurs forums anglais, je n'arrive pas à trouver LA méthode me permettant d'envoyer des trames hexadécimale à mon automate pour quelle soit interprétées...
La connexion à ce dernier est pourtant bien réalisée via un convertisseur USB-RS232.
Exemple :
J'ai une trame suivante :
Matrame= 10 01 00 05 33 5D 6F 2E
Dois-je tout d'abord la convertir via la méthode "HEX" ?
Pour l'envoyer, j'utilise la fonction "ser.write", est-ce bon ?
A l'inverse, l'automate dois me retourner suite à la lecture de cette trame, une trame hexadécimale, je devrais la lire avec "ser.read" puis la convertir avec "hex" est-ce exact ?
Merci pour votre aide, et bonne journée à tous.
Apres avoir parcouru plusieurs forums anglais, je n'arrive pas à trouver LA méthode me permettant d'envoyer des trames hexadécimale à mon automate pour quelle soit interprétées...
La connexion à ce dernier est pourtant bien réalisée via un convertisseur USB-RS232.
Exemple :
J'ai une trame suivante :
Matrame= 10 01 00 05 33 5D 6F 2E
Dois-je tout d'abord la convertir via la méthode "HEX" ?
Pour l'envoyer, j'utilise la fonction "ser.write", est-ce bon ?
A l'inverse, l'automate dois me retourner suite à la lecture de cette trame, une trame hexadécimale, je devrais la lire avec "ser.read" puis la convertir avec "hex" est-ce exact ?
Merci pour votre aide, et bonne journée à tous.
Modifié en dernier par Nidog le mar. 4 sept. 2018 17:48, modifié 1 fois.
Re: Envoi de trames Hexa via port RS232
Salut,
Déjà quel type d'automate utilise tu ? (c'est juste par curiosité)
ensuite quel module utilise tu, car d'après ce que je comprend tu veux échanger des octets(bytes) avec ton automate, mais il faut savoir que de chaque coté cela peu être interpréter comme des entiers, 0x00 à 0xFF en hexa correspond de 0 à 255 en entier.
regarde du coter des bytes et bytearrays en python
Déjà quel type d'automate utilise tu ? (c'est juste par curiosité)
ensuite quel module utilise tu, car d'après ce que je comprend tu veux échanger des octets(bytes) avec ton automate, mais il faut savoir que de chaque coté cela peu être interpréter comme des entiers, 0x00 à 0xFF en hexa correspond de 0 à 255 en entier.
regarde du coter des bytes et bytearrays en python
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
Re: Envoi de trames Hexa via port RS232
Merci pour ton retour.Manfraid a écrit :Salut,
Déjà quel type d'automate utilise tu ? (c'est juste par curiosité)
ensuite quel module utilise tu, car d'après ce que je comprend tu veux échanger des octets(bytes) avec ton automate, mais il faut savoir que de chaque coté cela peu être interpréter comme des entiers, 0x00 à 0xFF en hexa correspond de 0 à 255 en entier.
regarde du coter des bytes et bytearrays en python
Pour l'automate, c'est un automate d'origine ALSTOM (projet industriel).
Concernant les modules je suis passer par divers modules mais avec lesquels je faisais fausse route ... (je ne saurai plus te les citer tellement j'ai essayé de choses ...).
En effet je souhaite échanger des Bytes (j'aurai du être plus précis), je vais me pencher sur les modules que tu me propose merci
De ce que je comprends, en utilisant les bytes/bytesarrays, l'automate sera en capacité d'interpréter les entiers reçus et vis versa ?
Désolé si je manque de précision ou de justesse dans mes dire mais je commence depuis peu dans le milieu du python.
Re: Envoi de trames Hexa via port RS232
donc les butes/bytearrays vont te servir pour stocker et lire les données, ensuite il te faut un module du type pyserial pour envoyer/recevoir ces données
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
Re: Envoi de trames Hexa via port RS232
Ok, et donc avec le pyserial je transmets ma trame sous forme d'octets bruts, pas besoin d'effectuer un hex(...) ?Manfraid a écrit :donc les butes/bytearrays vont te servir pour stocker et lire les données, ensuite il te faut un module du type pyserial pour envoyer/recevoir ces données
Re: Envoi de trames Hexa via port RS232
non pour moi il n'y a pas besoin. et de plus comme tu travaille avec des octets tu n'a aucun soucis d'inversion d'octets
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.
Re: Envoi de trames Hexa via port RS232
Super merci pour tes explications, je te ferai un retour une fois tout ceci testé !
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: Envoi de trames Hexa via port RS232
Bien sur que tu dois la convertir, sinon comment veux tu que ton buffer d'envois devine que c'est de l'hexa ?
Si Matrame est une chaine de caractères qui représente des valeurs en hexa séparées par des espace, la conversion peut etre passé
directement dans la fonction d'écriture
Code : Tout sélectionner
Matrame = "10 01 00 05 33 5D 6F 2E"
ser.write(bytearray.fromhex(Matrame))
Code : Tout sélectionner
Matrame = "10 01 00 05 33 5D 6F 2E"
for b in bytearray.fromhex(Matrame):
print ("Hexa " + hex(b) + " Byte " + str(b) )
l'automate ne te retournera jamais une trame hexa sur un port series. La seule chose qu'il peut t'envoyer et que tu peux recevoir, c'est un tableau de bytes ou chacun d'eux a la longueur defini par l'initialisation du port serie (généralement 8 bits/byte, mais ca peut aussi etre 7 ...). Après c'est a toi de convertir ces bytes suivant ce qu'ils sont censées etre dans le programme qui reçoit.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
Re: Envoi de trames Hexa via port RS232
Merci pour toutes ces explication @Bud Spencer, j'y vois plus clair maintenant!
En effet cela paraît plus logique une fois expliqué...
En effet cela paraît plus logique une fois expliqué...
Re: Envoi de trames Hexa via port RS232
Bonjour,
Afin de vous faire un retour, l'envoi de trames ainsi que la récéption d'une réponse du tiroir sont bien établis grâce à votre aide aux lignes suivantes :
Il me reste cependant une question, le tiroir électronique genère un checksum de 4 Bytes en fin de trame.
Afin de valider l'intégrité des données, je souhaiterai établir le calcul de ce checksum avec la trame reçue.
Le checksum portant sur 4 Bytes, je ne peux pas utiliser la fonction hashlib.md5 ...
J'ai réussi à établir le calcul via Vbscript, mais j'ai du mal à l'établir en python..
Auriez-vous des pistes svp afin de trouver une équivalence en Python, ou quelque chose de plus simple ?
Merci d'avance !
Afin de vous faire un retour, l'envoi de trames ainsi que la récéption d'une réponse du tiroir sont bien établis grâce à votre aide aux lignes suivantes :
Code : Tout sélectionner
def test_serial():
#Envoi de la trame du Terminal vers tiroir électronique
Trame_connect = "1002010000000000000000008000000010101003"
ser.write(bytearray.fromhex(Trame_connect))
time.sleep(1)
#Décriptage trame reçue Tiroir électronique vers Terminal
#while True:
retour_MPU_connect = ser.read()
print hex(int(retour_MPU_connect.encode('hex '),16)),
Afin de valider l'intégrité des données, je souhaiterai établir le calcul de ce checksum avec la trame reçue.
Le checksum portant sur 4 Bytes, je ne peux pas utiliser la fonction hashlib.md5 ...
J'ai réussi à établir le calcul via Vbscript, mais j'ai du mal à l'établir en python..
Code : Tout sélectionner
#########
#VBScript#
#########
somme_trame = 0
For Offset = 1 To Len(trame_totale) Step 8
' inversion MSB LSB
Mot = "&h" + Mid(trame_totale, Offset + 6, 2) + Mid(trame_totale, Offset + 4, 2) + Mid(trame_totale, Offset + 2, 2) + Mid(trame_totale, Offset, 2)
somme_trame = somme_trame + Val(Mot)
Next Offset
checksum_trans = Modulo(((16 ^ 8) - somme_trame), 16 ^ 8)
Checksum_Transport = checksum_trans
Merci d'avance !