2016-07-22 8 views
0

Ich habe Probleme mit der Aktualisierung dieser globalen Variablen, die ein Array von Strings ist. Diese rfDataArray soll aktualisiert werden, da die RF-Daten von einem anderen Gerät kommen. Nun, wenn ich diese ohne Senden von etwas zu den Cloud-Servern getestet habe, funktioniert es (die rfDataArray wird aktualisiert, so oft wie die Daten gesendet werden), aber sobald ich mit dem Senden der Daten zu starten, scheint die rfDataArray Array zu sein bei der ersten Array steckt und nicht immer wieder ...Variable wird nicht aktualisiert, nachdem Daten an Cloud-Server gesendet wurden

import httplib, urllib 
import time, sys 
import serial 

key = 'MY_API_KEY' 
rfDataArray = [] 
rfWaterLevelVal = 0 

ser = serial.Serial('/dev/ttyUSB0',9600) 

def rfWaterLevel(): 
    global rfWaterLevelVal 
    global rfDataArray 

    rfDataArray = ser.readline().strip().split() 
    print 'incoming: %s' %rfDataArray 
    if len(rfDataArray) == 5: 
     rfWaterLevelVal = float(rfDataArray[4]) 
     print 'RFWater Level1: %.3f cm' % (rfWaterLevelVal) 


def sendRFWaterlevel(): 
    params = urllib.urlencode({'field1':rfWaterLevelVal, 'key':key}) 
    headers = {"Content-type": "application/x-www-form-urlencoded", 
       "Accept": "text/plain"} 
    conn = httplib.HTTPConnection("api.thingspeak.com:80", timeout = 5) 
    conn.request("POST", "/update", params, headers) 
    print 'RFWater Level2: %.3f cm' % (rfWaterLevelVal) 
    response = conn.getresponse() 
    print response.status, response.reason 
    data = response.read() 
    conn.close() 

while True: 
    try: 
     rfWaterLevel() 
     time.sleep(1) 
     sendRFWaterlevel() 
     time.sleep(3) 
    except KeyboardInterrupt: 
     print "caught keyboard interrupt" 
     sys.exit() 

ich die rfDataArray Variable aktualisieren muß aktualisiert wird erhalten (so wird die rfWaterlevelVal aktualisiert, um den Cloud-Server zu senden über).

Antwort

0

Sie geraten in eine Wettlaufsituation. Das Array versucht Werte zu speichern, bevor die Cloud es zurücksenden kann. Sie müssen die Vorgänge asynchron durchführen. Eine Lösung besteht darin, die Callback-Methoden von Python Multithreading zu verwenden. Alternativ können Sie einen 'Sperrmechanismus' verwenden und den Rest des Programms nicht ausführen, bis Sie eine Antwort von der Cloud erhalten.

+0

Könnten Sie mir vielleicht Hinweise geben, wie Sie diese beiden möglichen Lösungen anwenden können? – Verglas

+0

[Hier ist eine einfache Stack Overflow-Lösung] (http://stackoverflow.com/questions/1239035/asynchronous-method-call-in-python) für asynchrone Aufrufe. [Hier] ist Python-Dokumentation für synchrone Aufrufe (https://docs.python.org/3/library/asyncio-sync.html) – rt88