2016-07-22 75 views
0

我一直在更新這個全局變量是一個字符串數組時遇到問題。這個rfDataArray應該是隨着射頻數據從另一個設備進入而更新的。現在,當我測試了這個而沒有發送任何東西到雲服務器,它的工作原理(rfDataArray得到更新頻繁的數據發送),但只要我開始發送數據,rfDataArray數組似乎是停留在最初的數組,不會再次更新過...發送數據到雲服務器後變量不更新

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() 

我需要更新rfDataArray變量(所以rfWaterlevelVal更新發送到雲服務器)。

回答

0

您正處於競賽狀態。該陣列試圖在雲可以將其發回之前存儲值。您需要異步執行操作。一種解決方案是使用Python多線程的回調方法。或者,您可以使用某種「鎖定」機制,並在您獲得雲端響應之前不執行程序的其餘部分。

+0

你能否給我指出如何應用這兩種潛在解決方案? – Verglas

+0

[這裏是一個簡單的堆棧溢出解決方案](http://stackoverflow.com/questions/1239035/asynchronous-method-call-in-python)異步調用。 [Here]是用於Synchronous調用的Python文檔(https://docs.python.org/3/library/asyncio-sync.html) – rt88