2016-07-29 1 views
0

Итак, в настоящее время я - это два метода, когда каждый читает RF-данные с другого устройства постоянно, а другой метод отправляет эти данные так часто.Постоянно выполняйте один метод и другой метод, выполняющий каждый определенный период

Как я мог это сделать? Мне нужно, чтобы входящие данные RF постоянно обновлялись и принимались, в то время как метод sendData() просто извлекает данные из глобальной переменной всякий раз, когда это возможно.

Heres ниже код до сих пор, но это не работает ...

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-данных, тогда данные rf перестают обновляться (принятый конец), и, таким образом, отправляемые данные неточно соответствуют тому, что отправляется от радиочастотного передатчика.

Заранее благодарен!

ответ

1

Я не могу дать вам полное решение, но я могу направлять вас в правильном направлении.

У вашего кода три проблемы.

  1. Process начинается (как следует из названия) новый процесс, а не новый поток. Новый процесс не может обмениваться данными со старым процессом. Вместо этого вы должны использовать mutlithreading. Посмотрите threading как объяснено here

  2. Вы звоните rfWaterLevel() в главном потоке. Перед входом в Loop вам нужно запустить второй поток.

  3. Вы создаете вторую нить снова и снова внутри цикла. Создать его только один раз и поставить время цикла внутри функции

Ваша основная структура программы должна быть такой:

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