所以目前我是这两种方法,其中一个人不断地从另一个设备读取RF数据,而另一个方法经常发送这些数据。
我怎么能这样做?我需要不断更新和接收RF数据传入,而sendData()方法只需从全局变量中获取数据即可。
到目前为止,下面是代码,但它不起作用......
import httplib, urllib
import time, sys
import serial
from multiprocessing import Process
key = 'MY API KEY'
rfWaterLevelVal = 0
ser = serial.Serial('/dev/ttyUSB0',9600)
def rfWaterLevel():
global rfWaterLevelVal
rfDataArray = ser.readline().strip().split()
print 'incoming: %s' %rfDataArray
if len(rfDataArray) == 5:
rfWaterLevelVal = float(rfDataArray[4])
print 'RFWater Level1: %.3f cm' % (rfWaterLevelVal)
#rfWaterLevel = 0
def sendData():
global rfWaterLevelVal
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()
p = Process(target=sendData(), args())
p.start()
p.join()
#Also tried threading...did not work..
#t1 = threading.Thread(target=rfWaterLevel())
#t2 = threading.Thread(target=sendData())
#t1.start()
#t1.join()
#t2.join()
except KeyboardInterrupt:
print "caught keyboard interrupt"
sys.exit()
请帮忙!
只是为了澄清,我需要rfWaterLevel()方法不断运行,因为rf数据不断传入,我需要sendData()只要它准备再次发送就会被调用(大约每5秒左右) 。但似乎,如果传入的射频数据存在任何延迟,则rf数据会自行更新(接收端),因此发送的数据与射频发射器发送的数据不准确。
提前致谢!
答案 0 :(得分:1)
我不能给你一个完整的解决方案,但我可以引导你走向正确的方向。
您的代码有三个问题。
Process
启动(顾名思义)一个新进程,而不是一个新线程。
新进程无法与旧进程共享数据。
你应该使用mutlithreading。
按照here
threading
您正在主线程中调用rfWaterLevel()
。
您需要在进入while循环之前启动第二个线程。
您正在while循环中一次又一次地创建第二个线程。 只创建一次并将while循环放在函数
您的基本程序结构应如下所示:
import time
def thread_function_1():
while True:
rfWaterLevel()
def thread_function_2():
while True:
sendData()
time.sleep(5)
# start thread 1
thread1 = Thread(target = thread_function_1)
thread1.start()
# start thread 2
thread2 = Thread(target = thread_function_2)
thread2.start()
# wait for both threads to finish
thread1.join()
thread2.join()