2016-07-29 151 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

相關問題