2016-07-29 5 views
0

現在、私はこれらの2つの方法で常に別のデバイスからRFデータを読み取り、別の方法でそのデータを頻繁に送信します。1つのメソッドを常に実行し、特定の期間ごとに別のメソッドを実行する

どうすればいいですか? sendData()メソッドはできるだけグローバル変数からデータを取得するだけで、RFデータの受信を常に更新して受信する必要があります。

相続人はこれまでのところ、それは働いていない以下のコード...

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() 

助けてください!

明確にするために、rfデータが絶え間なく着信するので、私はrfWaterLevel()メソッドが絶えず実行され、sendData()を呼び出すだけですぐに呼び出すことができます(約5秒ごと)。しかし、それが入ってくるrfデータに何らかの種類の遅延があると、rfデータ自体が更新されず(受信された)、送信されるデータはrf送信機から送信されているものに対して正確ではないように見える。

ありがとうございます!

答えて

1

私はあなたに完全な解決策を与えることはできませんが、私は正しい方向にあなたを導くことができます。

コードには3つの問題があります。

  1. Process開始(名前が示すように)新しいプロセスではなく、新しいスレッド。 新しいプロセスは古いプロセスとデータを共有できません。 代わりにmutlithreadingを使用する必要があります。 here

  2. が説明したように は、あなたがメインスレッド内rfWaterLevel()を呼び出しているthreadingを見てください。 whileループに入る前に、2番目のスレッドを開始する必要があります。

  3. あなたはもう一度whileループ内に2番目のスレッドを作成しています。一度だけ、それを作成し、関数内の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

おかげで、ちょうど質問、 「止める」とは思わない?だから、私が意味することは、最初のスレッド関数は、常にrfデータが絶えず入ってくるので、常に実行されるはずです...私はちょうど両方の "join()"文を取り除きますか? – Verglas

関連する問題