Script Python pour envoyer commande ASCII

Fermé
TDupuy Messages postés 4 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 6 mars 2020 - Modifié le 5 mars 2020 à 10:59
TDupuy Messages postés 4 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 6 mars 2020 - 6 mars 2020 à 16:42
Bonjour,
je débute en Python et dans le cadre de mon stage, je suis face à un problème, voilà la situation :

- Je suis sur Windows, connecté en SSH à une carte RaspberryPi.
- La carte a un HAT RS485 et est connectée à une station météo.

Diverses commandes ASCII permettent de communiquer avec cette station météo mais voici celle qui me permet d'obtenir les données : " 0R0 "

Les données ont cette forme à l'arrivée :
0R0,Dn=000D,Dm=000D,Dx=180D,Sn=000.0M,Sm=000.0M,Sx=000.2M,Ta=031.2C, Ua=045.4P,Pa=000995.1H,Rc=0001.6M,Sr=0000.8W,UV=00I,NX=056.4B,NI=052.4B,NS
=053.7B,PM2.5=0054.0U,PM10=0056.0U,Lux=000108L

Maintenant, voilà ce que je souhaite faire :

Créer un script qui permettrait :

- d'envoyer la commande 0R0 et lui donner les paramètres suivants :
'/dev/ttyS0',19200,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,bytesize=serial.EIGHTBITS,timeout=None

- d'afficher UNIQUEMENT la ligne commençant par 0R0 (pour éviter les lignes d'erreurs ou les informations peu importantes) (donc de 0R0 à Lux)

- modifier la structure du résultat ( par exemple pour TA qui correspond à la température, je souhaiterai que ce soit uniquement 31.2 d'affiché. Je voudrais aussi pouvoir faire un retour à la ligne après chaque type de donnée)

- stopper le programme une fois l'affichage de la totalité des données affichées à l'écran terminé.


Voilà, je sais que cela fait beaucoup mais je compte sur vous !

Merci d'avance !

3 réponses

quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 344
5 mars 2020 à 16:30
Bonjour,
Pourquoi ne pas avoir poser ces simples questions dans votre premier message plutôt que d'exposer tout ce que votre script doit faire sans préciser votre problème ?

Vous pouvez récupérer la ligne en découpant la chaine reçue aux retours à la ligne avec split puis en cherchant la ligne qui commence par 0R0.
Et pour modifier les données, vous pouvez les séparer en séparant au niveau des virgules puis vous pouvez modifier individuellement chaque donnée.
2
TDupuy Messages postés 4 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 6 mars 2020
Modifié le 6 mars 2020 à 17:52
Bonjour, merci de votre réponse.
Si j'ai mis les détails c'est pour pouvoir faire comprendre le script final voulu, l'objectif et connaître les différentes subtilités, rien de plus !

Voici ce que j'ai actuellement


 import serial

ser = serial.Serial('/dev/ttyS0',19200,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,bytesize=serial.EIGHTBITS,timeout=None)

while 1:
        ser.write("0R0\r\n")
        data = ser.readline()
        print(data)



La chose que je n'arrive pas à comprendre c'est comment manipuler ces valeurs données par 0R0 alors qu'on ne les a pas de base, comme un texte ou une date par exemple. Quand on a un texte à l'origine cela semble plutôt "facile" mais modifier le format d'une trame sans l'avoir au début, je ne vois pas comment faire.
0
quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 344 > TDupuy Messages postés 4 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 6 mars 2020
6 mars 2020 à 16:37
Vous n'avez pas le texte au début mais vous l'avez dans data donc vous pouvez manipuler la variable comme vous le souhaitez.

Vous ne connaissez pas le texte exacte mais vous savez quelle forme il aura. Par exemple vous savez que toutes les données sont séparées par des virgules et que chaque élément est sous la forme variable=valeur.
Vous pouvez donc découper le texte au niveau des virgules puis couper chaque partie au niveau des égales. Vous pouvez ensuite traiter chaque valeur indépendament.

Encore une fois, vous ne savez pas quelles valeurs vous allez obtenir mais vous savez qu'elles auront toujours la même forme donc vous pouvez écrire un algorithme qui fonctionne quelle que soit la valeur.
Par exemple à priori la température se termine toujours par la lettre C que vous voulez enlever donc il vous suffit de retirer le dernier caractère de la chaine puis de convertir le reste en float.

Voici un code pour l'exemple :
for element in data.split(","):
    if element == "0R0":
        continue

    variable, valeur = element.split("=")
    if variable == "Ta":
        temperature = float(valeur[:-1])
        print("Temperature =", temperature)
0
TDupuy Messages postés 4 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 6 mars 2020 > quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024
6 mars 2020 à 16:42
Merci pour vos réponses, cela va bien m'aider,

Bon week-end à vous !

Cordialement
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 325
Modifié le 5 mars 2020 à 11:29
Bonjour,

En stage, dis-tu ?

Donc...

CCM ne fait pas les exercices. Une aide peut être apportée si le demandeur montre le travail qu'il a déjà effectué.
https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/

0
TDupuy Messages postés 4 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 6 mars 2020
Modifié le 5 mars 2020 à 11:37
Ma question est juste de savoir s'il est possible de cibler une ligne précise avec un print et si on peut modifier une data qui arriverait après l'envoi de la commande 0R0.

Je ne suis pas là pour avoir le code complet servi sur un plateau, juste pour avoir ces réponses après c'est vrai que cette question est toujours dans le cadre de mon stage.
-1