我在更新这个字符串数组的全局变量时遇到了麻烦。当rf数据从另一个设备进入时,应该更新此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 :(得分:0)
你正在遇到竞争状态。该阵列试图在云可以将其发回之前存储值。您需要异步执行操作。一种解决方案是使用Python多线程的回调方法。或者,你可以使用一些“锁定”机制,而不是执行程序的其余部分,直到你从云端得到响应。