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 :

Pourquoi mon if ne peut pas comparer une valeur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut Pourquoi mon if ne peut pas comparer une valeur
    Bonjour à tous

    Mon but est de lire ce qui est envoyer dans mon serial.

    Je recois des position GPS et cette commande me retourne toujours false alors qu'elle est true

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    print ("raw:", data) #prints raw data
    print(data[0:6])
    if data[0:6] == "$GPRMC":
        print('2')

    print 2 n'est jamais afficher.

    Par contre voici ce que me print data[0:6]
    raw: b'$GPRMC,220135.00,A,4627.20773,N,00613.15008,E,0.632,,200420,,,A*7A\r\n'
    b'$GPRMC'
    il y a ce b. qu'est-ce qu'il veut dire, des bytes?

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par pierrot10 Voir le message

    il y a ce b. qu'est-ce qu'il veut dire, des bytes?
    Oui.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Pour faire ce que tu veux une possibilité :


    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print ("raw:", data) #prints raw data
    print(data[0:6])
    if data[0:6].decode() == "$GPRMC":
        print('2')

    Mais autant tout convertir : data = data.decode()

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut
    Je pense avoir compris pourquoi,
    parce que data est byte et la comparaison est un str

    J'ai essayé ceci qui fonctionne

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sentence = data[0:6]
        if sentence.decode('UTF-8') == "$GPRMC":

    Mais je suis pas tout à fait convaincu. Je donne mon code dans le prochain message

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut
    Voici mon code au complet

    Comment je oeux faire pour quitter la boucle?

    Je fais appelle à mon fonction
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    lat,lon,date = get_gps()
    Code python : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    def get_gps():
       #GPIO.output(gps_power, 1)
        try:
            with serial.Serial('/dev/ttyS0', baudrate=9600, timeout=1) as ser:
                while True:
                    data = ser.readline()
                    #if data[0:6] == "b'$GPRMC":
                    #    mnea  = pynmea2.parse(data)
                    #    print(mnea.latitue)
     
                    parseGPS(data) # J'aimerais bien un nouveau paramètre comme parseGPS(data,"GPRMC")
                    print('1')
        except Exception as e:
            print('Error reading serial port:' + e)
     
    def parseGPS(data):
        print ("raw:", data) #prints raw data
        print(data[0:6])
        sentence = data[0:6]
        if sentence.decode('UTF-8') == "$GPRMC":
            print('2')
            spdata = data.decode('UTF-8')
            sdata = spdata.split(",")
            if sdata[2] == 'V':
                print ('no satellite data available')
                return
            print('---Parsing GPRMC---')
            time = sdata[1][0:2] + ":" + sdata[1][2:4] + ":" + sdata[1][4:6]
            lat = decode(sdata[3]) #latitude
            dirLat = sdata[4]      #latitude direction N/S
            lon = decode(sdata[5]) #longitute
            dirLon = sdata[6]      #longitude direction E/W
            speed = sdata[7]       #Speed in knots
            trCourse = sdata[8]    #True course
            date = sdata[9][0:2] + "/" + sdata[9][2:4] + "/" + sdata[9][4:6]#date
     
            print("time : %s, latitude : %s(%s), longitude : %s(%s), speed : %s, True Course : %s, Date : %s" %  (time,lat,dirLat,lon,dirLon,speed,trCourse,date))
            return lat,lon,date
     
        #if str.find('GGA') > 0:
            #msg = pynmea2.parse(str)
            #msg.latitude
            #print "Timestamp: %s -- Lat: %s %s -- Lon: %s %s -- Altitude: %s %s -- Satellites: %s" % (msg.timestamp,msg.lat,msg.lat_dir,msg.lon,msg.lon_dir,msg.altitude,msg.altitude_units,msg.num_sa$
     
     
    def decode(coord):
        #Converts DDDMM.MMMMM > DD deg MM.MMMMM min
        x = coord.split(".")
        head = x[0]
        tail = x[1]
        deg = head[0:-2]
        min = head[-2:]
        return deg + " deg " + min + "." + tail + " min"

    Le problème des qu'il a trouver GPRMC, il continue a looper. et je pense que c'est parce que j'ai un WHILE True, donc il troune en boucle car elle n'est jamais rompue.
    Donc, ou est-e que je met un break, dans parceGPS()?

    Finalement pour que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lat,lon,date = get_gps()
    prennent les valeurs trouvé, le return se fait bien parseGPS()?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par pierrot10 Voir le message

    Comment je oeux faire pour quitter une boucle?
    Ben en général on quitte une boucle quand la ou les conditions voulue(s) sont remplie(s)...

    Dans ta boucle il y a mais combien y a-t-il de ligne à lire ?
    Si il n'y en a qu'une alors pas besoin de la boucle while True...

    Citation Envoyé par pierrot10 Voir le message
    Finalement pour que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lat,lon,date = get_gps()
    prennent les valeurs trouvé, le return se fait bien parseGPS()?
    Si tu tiens à faire comme ça alors dans la fonction get_gps il faut que tu remplaces parseGPS(data) par return parseGPS(data)...

    Et pas besoin de la boucle car apparemment tu ne lis qu'une ligne...

    PS : Corrige une erreur : remplace print('Error reading serial port:' + e) par print('Error reading serial port:', e)...

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par pierrot10 Voir le message
    Je recois des position GPS et cette commande me retourne toujours false alors qu'elle est true

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    print ("raw:", data) #prints raw data
    print(data[0:6])
    if data[0:6] == "$GPRMC":
        print('2')
    Pour répondre à votre question data[0:6] == b"$GPRMC".
    Et si vous aviez compris ce que je vous racontais dans une autre discussion, vous sauriez que:
    $GPRMC,220135.00,A,4627.20773,N,00613.15008,E,0.632,,200420,,,A*7A
    est une trame NMEA 0183.

    Elle utilise tous les caractères ASCII (et est donc encodée ASCII) et que les 2 derniers bytes (7E) sont un checksum des données qui sont entre les caractères '$' et '*' de la trame.

    Ce qui signifie que vous avez un checksum à calculer pour vérifier l'intégrité des données reçues avant de pouvoir en faire quoi que ce soit.

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

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 166
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 166
    Par défaut
    Bonjour Wiztrick et beginner

    Merci pour vos réponses et toutes vos suggestions.
    D'abord, je m'excuse car j'ai pas vu vos réponses et il y a eu de l'avancement. Aussi apparemment, j'ai posté un message sans avoir vu celui de beginner.

    "Historiquement", j'essayais de faire mon travail avec pynmea2 selon un tutorial. N'y arrivant pas à récupérer la trame venant de serial, je me suis penché sur la "solution manuelle", d'ou mes codes et mes fonctions.

    La source du problème était bien

    Tu compares des bytes à une string
    et le decode() est bien la solution.

    J'ai donc réussi à lire ma trame. Donc j'ai repris la solution avec pynmea2 car je trouve ceci plus simple et propre

    Code python : 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
     
    get_gps("GPRMC")
    def get_gps(sentence):
        #GPIO.output(gps_power, 1)
        try:
            with serial.Serial('/dev/ttyS0', baudrate=9600, timeout=1) as ser:
                while True:
                    # read 20 lines from the serial output, if not leave
                    for i in range(20):
                        data = ser.readline()
                        sdata=data[0:6].decode('UTF-8')
                        if sdata == "$" + sentence:
                            mnea  = pynmea2.parse(data.decode('UTF-8'))
                            print('DEBUG')
                            print(mnea)
                            print(mnea.latitude)
                            print(mnea.longitude)
                            print(mnea.time)
                            print(mnea.date)
                            return mnea.latitude, mnea.longitude
                            break
     
                     print('Cannt find NMEA sentence')
                     # Leave while
                     break
     
                    # NOT USED
                    # parseGPS(data)
     
        except Exception as e:
            print('Error reading serial port:' , e)
    et j'ai appliqué la trouvaille à celle-ci, ce qui me donne quelque chose de plus simple et élégant, si je peux dire ainsi.

    Au passage
    PS : Corrige une erreur : remplace ...
    Merci, c'est fait

    De là, j'ai encore deux petites questions et une dernière pour Wiztricks

    Q1: Est-ce que le break est indispensable après le return? Est-ce que le return suffit pour quitter la loop?
    Q2: Est-ce qu'il y a plus élégant?

    Elle utilise tous les caractères ASCII (et est donc encodée ASCII) et que les 2 derniers bytes (7E) sont un checksum des données qui sont entre les caractères '$' et '*' de la trame.
    C'est intéressant,

    et que les 2 derniers bytes (7E)
    Tu veux dire 7A?

    En fait c'est cela qui me permettrait de voir si la trame est valide ou pas?
    Ce qu'il manque encore, c'est justement cela, car même s'il trouve $GPRMC, et que la trame n'est pas valide, je préfère qu'il me génère une exception, ou qu'il ne quitte pas le while, jusqu'à ce qu'il rencontre une trame valide, selon le type voulu.

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Je pense avoir compris pourquoi,
    parce que data est byte et la comparaison est un str
    Tu compares des bytes à une string

    Citation Envoyé par pierrot10 Voir le message
    J'ai essayé ceci qui fonctionne
    Ben oui ça correspond à ce que je t'ai proposé, sauf que je n'ai pas précisé "UTF-8"...

Discussions similaires

  1. Réponses: 25
    Dernier message: 01/05/2020, 06h36
  2. Réponses: 9
    Dernier message: 08/08/2016, 15h52
  3. [AC-2007] un index ou une clé principale ne peut pas contenir une valeur null
    Par sarhouda dans le forum Access
    Réponses: 6
    Dernier message: 13/12/2012, 18h54
  4. Réponses: 11
    Dernier message: 06/12/2008, 13h15
  5. Réponses: 3
    Dernier message: 06/03/2007, 14h15

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