2016-04-12 4 views
0

Ich bin ein wenig neu in Python und ich versuche, eine Aufgabe zu erfüllen.Abrufen endgültigen Wert von while-Anweisung zurückgegeben

Was ich versuche

ich diesen Code haben zu erreichen, die GPS-Daten von einem Thread in einer while-Schleife sammelt und poste ich, dass die Daten auf meinem Webserver.

Problem

Das Problem hier ist, bei der ersten Ausführung die Breite/Länge ist immer Null und korrekte Werte kommen danach. Die while-Schleife ruft die GPS-Koordinaten in zufälliger Anzahl von 5-10 ab und sie werden alle in meine Datenbank geschrieben.

Das ist nicht korrektes Verhalten, da ich will nur eine Instanz der Ergebnisse in die Datenbank zu einem beliebigen Zeitpunkt geschrieben werden. Ich habe versucht, eine IF-Anweisung in der While-Schleife setzen, um zu sagen "Wenn Breite> 0 Upload-Ergebnisse in die Datenbank und brechen sonst Schleifen fortsetzen, aber ich bekomme die Syntax falsch zu bekommen.

Wie Sie den Code sehen, die an meine Post Datenbank ist innerhalb der while-Schleife, so dass alle

try: 
    gpsp.start() # start it up 
    print ' GPS' 
    while True: 


     print ' GPS reading' 
     print 'latitude ' , gpsd.fix.latitude 
     print 'longitude ' , gpsd.fix.longitude 

     if gpsd.fix.latitude > 0: 
     payload={'id':"P8",'lat':gpsd.fix.latitude,'lon':gpsd.fix.longitude} 
     r= requests.post("http://my-server.com/Pi/Loc.php",data=payload) 
     break 
     elif gpsd.fix.latutde=0: 


except (KeyboardInterrupt, SystemExit): #when you press ctrl+c 
    print "\nKilling Thread..." 
    gpsp.running = False 
    gpsp.join() # wait for the thread to finish what it's doing 
    print "Done.\nExiting." 

Jede mögliche Unterstützung geschätzt.

Mein Problem ist nicht die Koordinaten „Erfassen“, aber für die Unterstützung ich suche die Syntax bei der Korrektur anmelden nur ein Ich bin mir bewusst, dass der Code, den ich gezeigt habe, ein bisschen falsch ist, das ist genau das, was ich für jetzt habe.

Dies ist das Ergebnis der Ausführung des Codes (Ich habe den Einzug behoben und das if entfernt). Es gab tatsächlich viel mehr Zeilen, aber ich habe sie aus Gründen der Einfachheit gelöscht. Ich versuche nur, einen Weg zu finden, die letzten zu meinem Webserver

GPS 
GPS reading 
latitude  0.0 
longitude 0.0 
GPS reading 
latitude  **.292548333 
longitude **.379363333 
GPS reading 
latitude  **.292548333 
longitude **.379363333 
GPS reading 
latitude  **.292546667 
longitude **.379365 
GPS reading 
latitude  **.292546667 
longitude **.379365 
GPS reading 
latitude  **.292546667 
longitude **.379365 
GPS reading 
latitude  **.292546667 
longitude **.379365 

GPS reading 
latitude  **.292503333 
longitude **.379376667 
GPS reading 
latitude  **.292498333 
longitude **.379376667 
+5

Ihr Einzug ist falsch. Python stützt sich stark auf Einrückung. Sie vermissen auch eine Aussage unter dem 'elif' gänzlich. Und die 'elif'-Bedingung ist eine Aufgabe, kein Vergleich. – TigerhawkT3

+2

Die meisten GPS-Systeme benötigen ein paar Sekunden bis zu einigen Minuten, um genügend Satelliten aufzunehmen, um eine Korrektur zu erhalten. Daher sollten Sie vor Ihrer While-Schleife ein 'time.sleep (10)' oder etwas hinzufügen, um dem GPS genügend Zeit zum Aufwärmen zu geben. Sie haben auch 'gpsp.start()', aber Sie verwenden 'gpsd' überall. –

+0

@ TigerhawkT3 Ich weiß, dass der Code unvollständig ist, besonders unter elif, ich habe versucht, einen Weg zu finden, die Aufgabe zu erreichen, nur den letzten Artikel zu nehmen, anstatt alle – Grace

Antwort

0

wählen Wenn Sie nur ein Ergebnis geschrieben wollen, Ihre Schleife Zustand ändern:

try: 
    gpsp.start() 
except SomethingHere: 
    print('Oops, GPS failed!') 
    sys.exit() 

while not gpsp.fix.latitude: 
    time.sleep(4) # Pause till the GPS has obtained a fix 

lat = gpsp.fix.latitude 
lon = gpsp.fix.longitude 

payload = {'vehic':"PJ048",'lat':lat,'lon':lon} 

r = requests.post("http://my-server.com/Pi/Loc.php",data=payload) 
r.raise_for_status() 
+0

Danke, größtenteils funktioniert es gut, aber es gibt Zeiten, in denen es immer noch mehr als einen Datensatz schiebt in einer Sekunde. Schauen Sie sich den Zeitstempel aus der Datenbank an. '2016-04-12 03:12:14 2016-04-12 03:12:14 2016-04-12 03:12:14 2016-04-12 03: 12: 14'. Würde sein, weil ich das Skript jede Minute in einem Cron-Job anrufe? – Grace

+0

Warum reparieren Sie es nicht an Ihrem Server, um die Datensätze zu verwerfen, in denen der Zeitstempel bereits aufgezeichnet wurde, bis zu einer Sekunde? –

+0

könnte es sein. Sagen wir, das GPS ist "kalt". Der CRON ruft Ihr Skript jede Minute für 3 aufeinanderfolgende Minuten auf. All diese Instanzen laufen und warten darauf, dass das GPS "warm" wird. Sobald es "warm" ist, werden alle diese Instanzen ihre Daten protokollieren und alle drei haben den gleichen Zeitstempel. – craigsparks

0

Für Ihre nächste Ausgabe (mehrere Skripte ausgeführt wird), ohne den Server wechseln zu müssen, könnten Sie Ihre Cron-Eintrag entfernen, und führen diese aus einem Dienst in /etc/init.d Hinzufügen einer Verzögerung() -Methode und eine andere für immer while-Schleife:

try: 
    gpsp.start() 
except SomethingHere: 
    print('Oops, GPS failed!') 
    sys.exit() 

def delay(): 
    time.sleep(60) # sleep 60 seconds 


while True: 

    while not gpsp.fix.latitude: 
     time.sleep(4) # Pause till the GPS has obtained a fix 

    lat = gpsp.fix.latitude 
    lon = gpsp.fix.longitude 

    payload = {'vehic':"PJ048",'lat':lat,'lon':lon} 

    r = requests.post("http://my-server.com/Pi/Loc.php",data=payload) 
    r.raise_for_status() 
    delay() 
+0

Das ist eine gute Methode, aber der Grund, warum ich die CRON-Methode wirklich liebte, ist. Wenn aus irgendeinem Grund ein Anruf fehlgeschlagen ist und keine Daten für eine Minute protokolliert wurden, würde der Cron in der nächsten Minute dafür sorgen, und wahrscheinlich würde niemand es merken. Wenn ich dies jedoch in einem Dienst habe, habe ich das Gefühl, wenn die Maschine aus irgendeinem Grund neu startet und der Server nicht angerufen wird (Ist das möglich?) Gibt es keinen Platz für die Korrektur. – Grace

+0

Ein init.d-Dienst wird neu gestartet, wenn Maschine startet neu (falls konfiguriert). Sie können immer noch einen Cron verwenden, aber Sie werden die Dinge komplizierter machen, wenn Sie mehr als ein Skript gleichzeitig ausführen, wie Sie es schon erlebt haben. Vielleicht könntest du hier lesen, wie jemand anders einen Cron-Job benötigt hat, um zu sehen, ob ein Python-Skript läuft - [siehe hier] (http://stackoverflow.com/questions/9223381/using-cron-job-to-check-if- python-script-is-running) – craigsparks

+0

Ich mag das wirklich, außer dass. wenn die Verbindung fehlschlägt. es wird nicht weitergehen, wenn es wieder hergestellt ist. Haben Sie eine Lösung dafür? – Grace

Verwandte Themen