[RESOLU] Envoi de trames Hexa via port RS232

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Nidog
Messages : 14
Enregistré le : mer. 11 juil. 2018 18:05

[RESOLU] Envoi de trames Hexa via port RS232

Message par Nidog » sam. 14 juil. 2018 09:10

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.
Modifié en dernier par Nidog le mar. 4 sept. 2018 17:48, modifié 1 fois.

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Envoi de trames Hexa via port RS232

Message par Manfraid » sam. 14 juil. 2018 09:48

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
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.

Nidog
Messages : 14
Enregistré le : mer. 11 juil. 2018 18:05

Re: Envoi de trames Hexa via port RS232

Message par Nidog » sam. 14 juil. 2018 10:01

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
Merci pour ton retour.

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 Image

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.

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Envoi de trames Hexa via port RS232

Message par Manfraid » sam. 14 juil. 2018 10:56

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.

Nidog
Messages : 14
Enregistré le : mer. 11 juil. 2018 18:05

Re: Envoi de trames Hexa via port RS232

Message par Nidog » sam. 14 juil. 2018 11:00

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
Ok, et donc avec le pyserial je transmets ma trame sous forme d'octets bruts, pas besoin d'effectuer un hex(...) ?

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Envoi de trames Hexa via port RS232

Message par Manfraid » sam. 14 juil. 2018 11:02

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.

Nidog
Messages : 14
Enregistré le : mer. 11 juil. 2018 18:05

Re: Envoi de trames Hexa via port RS232

Message par Nidog » sam. 14 juil. 2018 11:03

Super merci pour tes explications, je te ferai un retour une fois tout ceci testé !

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Envoi de trames Hexa via port RS232

Message par Bud Spencer » dim. 15 juil. 2018 11:36

Nidog a écrit :
sam. 14 juil. 2018 09:10
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" ?
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))
A titre didactique, si tu veux voir a quoi ressemble les valeurs des bytes de Matrame après conversion tu peux faire ca

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) )
Nidog a écrit :
sam. 14 juil. 2018 09:10
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 ?
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).

Nidog
Messages : 14
Enregistré le : mer. 11 juil. 2018 18:05

Re: Envoi de trames Hexa via port RS232

Message par Nidog » dim. 15 juil. 2018 12:46

Merci pour toutes ces explication @Bud Spencer, j'y vois plus clair maintenant!

En effet cela paraît plus logique une fois expliqué...

Nidog
Messages : 14
Enregistré le : mer. 11 juil. 2018 18:05

Re: Envoi de trames Hexa via port RS232

Message par Nidog » mar. 17 juil. 2018 11:14

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 :D :

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)),
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..

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
Auriez-vous des pistes svp afin de trouver une équivalence en Python, ou quelque chose de plus simple ? :)

Merci d'avance !

Répondre

Retourner vers « Python »