2016-07-29 102 views
0

因此,目前我就是这样两种方法,一种是不断从另一个设备读取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秒钟左右一次)。但似乎如果对传入的射频数据有任何延迟,则射频数据会自行停止更新(接收端),因此发送的数据对射频发射器发送的数据不准确。

在此先感谢!

回答

1

我不能给你一个完整的解决方案,但我可以引导你走向正确的方向。

您的代码有三个问题。

  1. Process开始(顾名思义)一个新的进程,而不是一个新的线程。 新进程无法与旧进程共享数据。 您应该改用多线程。 看一看threading作为解释here

  2. 要调用rfWaterLevel()主线程里面。 您需要在进入while循环之前启动第二个线程。

  3. 您在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() 
+0

感谢您的回答,只是一个问题,如果有什么第一个线程不是“应该”停止?所以我的意思是,第一个线程函数应该是不断运行的,因为射频数据不断地出现......我是否摆脱了两者的“join()”语句? – Verglas

相关问题