[RESOLU] Envoi de trames Hexa via port RS232

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

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 » mar. 17 juil. 2018 14:37

Code : Tout sélectionner

somme_trame = 0

for h in ([trame_totale[i:i+8] for i in range(0,len(trame_totale),8)]):
	somme_trame += int(h[-2:] + h[-4:-2] + h[-6:-4] + h[-8:-6],16)
	
checksum_trans = ((16**8)-somme_trame) % (16**8)
Ne sachant pas qui est le diviseur dans ta fonction modulo il est possible que :

Code : Tout sélectionner

checksum_trans = (16**8) % ((16**8)-somme_trame)
Ce qui me semblerait plus logique
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 » mar. 17 juil. 2018 16:13

Merci pour ton aide.

Mais malheureusement je ne retrouve pas (exactement) le même code sous VBA et sous le code transmis en PY :

Avec trame_totale = "0000000001000000000000000300000007000000080000000000000000000000"

Je retrouve avec le code VB :
checksum_trans = 19

Et sous PY (avec ((16**8)-somme_trame) % (16**8)) :
checksum_trans = 4294967277

Ce qui me donne les checksum suivants :
VB = ED FF FF FF
PY = 0xffffffedL

Je pensais inverser les h[] dans :

Code : Tout sélectionner

somme_trame += int(h[-2:] + h[-4:-2] + h[-6:-4] + h[-8:-6],16)

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 » mar. 17 juil. 2018 20:14

Je ne sais pas ce qu'il y a dans ta fonction modulo. Perso, ca ne me dit rien puisque de mémoire en vbs pour calculer un modulo on faisait :
valeur mod diviseur

Je t'avouerais que j'ai tapé ce code vite fait sans le tester mais a la relecture le calcul de somme_trame me semble identique dans les 2 langages. Fais l'essais d'afficher la valeur de somme_trame avant le calcul de modulo pour voir si tu as la meme chose avec les 2 langages. Si j'ai un peu de temps demain (je promet rien ...) , je ferais moi meme l'essais.
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 » mer. 18 juil. 2018 07:57

Pardon erreur dans la lecture des Print()...

Sous VB j'ai :
somme_trame=1687329312
checksum_trans=2607637984

Et sous PY :
somme_trame=19
checksum_trans=4294967277

En sachant que le Modulo sous VB est calculé suivant :

Code : Tout sélectionner

'VB Script
Function Modulo(a, b)
	Modulo = a - (b * Int((a / b)))
End Function
Pour ensuite afficher le code HEX dans une cellule Excel, j'effectue une nouvelle inversion MSB LSB :

Code : Tout sélectionner

checksum_inv = Hex(Modulo(checksum_trans, 16 ^ 2)) & " " & Hex(Modulo(Int(checksum_trans / (16 ^ 2)), 16 ^ 2)) & " " & Hex(Modulo(Int(checksum_trans / (16 ^ 4)), 16 ^ 2)) & " " & Hex(Modulo(Int(checksum_trans / (16 ^ 6)), 16 ^ 2))
Le Problème étant déjà de retrouver le même résultat de somme_trame sous VB et sous PY :?

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

Re: Envoi de trames Hexa via port RS232

Message par Nidog » mer. 18 juil. 2018 08:44

Solution trouvée ! :D

J'ai fais abstraction du résultat "somme_trans" vu qu'une autre inversion MSB LSB est réalisée.

J'ai conservé le résultat checksum_trans sous PY (à savoir 4294967277), puis je réalise :

Code : Tout sélectionner

trame_fin = hex(checksum_trans)[2:10]
trame_fin_inv = hex(checksum_trans)[-3:-1] + " " + hex(checksum_trans)[-5:-3] + " " + hex(checksum_trans)[-7:-5] + " " + hex(checksum_trans)[-9:-7]
Je retrouve alors bien le même résultat que sous VB, même après essais avec d'autres Trames !

Merci beaucoup pour ton aide et ta patience @Bud Spencer ! : :lol:

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 » mer. 18 juil. 2018 10:08

Parfait :-)

De mon coté, à titre de controle et bonne conscience, je viens de faire l’essais vite fait du calcul de somme_trame avec la valeur de trame_totale que tu donnes et j’ai bien le même résultat aussi bien avec ton code qu’avec mon code python. Mon interpretation etait donc correcte.

Juste un petit détail qui a son importance. Ton code n’est pas du VBScript mais du VBA. (Les nommages explicite de fin de boucle Next et le convertisseur Val() existe en VB et VBA mais pas en VBscript ;-) )
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 » mer. 18 juil. 2018 10:25

Merci d'avoir prit du temps !

Oups erreur de néophyte pour le VBA ... Merci je saurai m'en rappeler !

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Envoi de trames Hexa via port RS232

Message par vague nerd » ven. 3 août 2018 15:33

Bonjour.

Si vous estimez que votre problème est résolu, merci d'ajouter [RESOLU] au début du titre du sujet.
Pour ce faire, visualiser le premier Post que vous avez réalisé, cliquez sur "Editer", et ajouter [RESOLU] devant le titre, sans l'effacer.

Cela permet que le message soit tout de suite identifié comme ayant eu une réponse correspondant à la demande.
Ainsi, les visiteurs en sont informés, aussi bien lors d'une recherche sur le forum qu'au travers des moteurs de recherche.

Merci d'avance !
Cordialement,

Vague Nerd

bruno83
Messages : 72
Enregistré le : lun. 11 mai 2015 13:29

Re: Envoi de trames Hexa via port RS232

Message par bruno83 » mar. 14 août 2018 23:18

Bonjour
J’utilise sans arrêt la liaison rs232 en python : Gsm commande AT, journal lumineux avec cheksum ,reconnaissance vocale,rfid,appli rs232 ..........
Ici je n’ai pas vu d’encodage et décodage truc classique en python 3 avec serial étrange !!!!
exemple : ser.write(b'AT+CMGF=1\r')
mais j’ai peut-être zappé le truc :oops:
a+ bruno

Répondre

Retourner vers « Python »