2016-07-29 5 views
0

So derzeit bin ich diese zwei Methode, wo man die RF-Daten von einem anderen Gerät ständig liest und eine andere Methode sendet diese Daten immer wieder.Halten Sie eine Methode ständig ausgeführt und eine andere Methode jeden bestimmten Zeitraum

Wie könnte ich das tun? Ich brauche die eingehenden RF-Daten, die ständig aktualisiert und empfangen werden, während die sendData() -Methode die Daten von der globalen Variable einfach abgreift, wann immer es möglich ist.

Heres den Code unten so weit, aber es funktioniert nicht ...

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

Bitte um Hilfe!

Nur um zu klären, brauche ich rfWaterLevel() -Methode, um ständig zu laufen, da die RF-Daten ständig ankommende, und ich sendData() nur aufgerufen werden muss, sobald es wieder bereit ist zu senden (etwa alle 5 Sekunden oder so)). Es scheint jedoch so, als ob, wenn irgendeine Art von Verzögerung für die ankommenden HF-Daten vorliegt, die HF-Daten nicht mehr selbst aktualisiert werden (das empfangene Ende) und somit die gesendeten Daten nicht genau sind, was vom HF-Sender gesendet wird.

Vielen Dank im Voraus!

Antwort

1

Ich kann Ihnen keine vollständige Lösung geben, aber ich kann Sie in die richtige Richtung führen.

Ihr Code hat drei Probleme.

  1. Process startet einen neuen Prozess (wie der Name schon sagt) und nicht ein neuer Thread. Ein neuer Prozess kann keine Daten mit dem alten Prozess teilen. Sie sollten stattdessen Mutlithreading verwenden. Werfen Sie einen Blick auf threading als here

  2. erklärt Sie fordern rfWaterLevel() innerhalb des Haupt-Thread. Sie müssen den zweiten Thread starten, bevor Sie die While-Schleife eingeben.

  3. Sie erstellen den zweiten Thread immer wieder innerhalb der while-Schleife. Erstellen Sie es nur einmal und legt die While-Schleife in der Funktion

Ihre grundlegende Programmstruktur soll wie folgt sein:

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

Danke für die Antwort, nur eine Frage, was passiert, wenn der erste Thread ist nicht "soll" aufhören? Was ich damit meine, ist, dass die erste Threading-Funktion ständig ausgeführt werden soll, da die RF-Daten ständig kommen ... werde ich die "join()" - Anweisungen für beide einfach los? – Verglas

Verwandte Themen