2016-07-22 74 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