2016-07-19 11 views
0

Так что у меня есть этот код, который постоянно получает данные через RF-приемник.request() в python, похоже, блокирует обновление переменной, которую я хочу отправить в моем коде

key = 'my api key' 
ser = serial.Serial('/dev/ttyUSB0',9600) 

def rfWaterLevel(): 
    rfWaterLevelArray = ser.readline().strip().split() 
    if len(rfWaterLevelArray) == 5: 
     rfWaterLevelVal = float(rfWaterLevelArray[4]) 
     params = urllib.urlencode({'field1':rfWaterLevelVal, 'key':key}) 
     headers = {"Content-typZZe" : "application/x-www-form-urlencoded","Accept":"text/plain"} 
     conn = httplib.HTTPConnection("api.thingspeak.com:80") 
     conn.request("POST", "/update", params, headers) 
     response = conn.getresponse() 
     data = response.read() 
     conn.close() 
while True: 
    try: 
     rfWaterLevel() 
     time.sleep(3) 
    except KeyboardInterrupt: 
     print "caught keyboard interrupt" 
     sys.exit() 

С точки зрения отправки данных и обновления thingspeak его работы. Однако есть большой недостаток. Переменная rfWaterLevelVal, которая отправляется, не обновляется вообще в соответствии с полученными данными. Таким образом, если изначально полученные rf-данные равны 30, что делает rfWaterLevelVal 30, то следующий раунд данных равен 40, отправляемые данные все еще застревают на 30.

Я попытался прокомментировать код по очереди, чтобы узнать, что такое что делает это произошло, и кажется, что это «заморозить» в обновлении rfWaterLevelVal переменной rfWaterLevelArray & происходит на линии ...

conn.request("POST", "/update", params, headers) 

любую помощь о том, почему мой rfWaterLevelArray или rfWaterLevelVal переменная не обновляется вообще после этого код запускается один раз?

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

+0

Не ответ, но заголовок Content-Type имеет опечатку. – Garett

+1

Предложение: вместо того, чтобы комментировать строки, которые меняют программу, вставляйте операторы печати. Представленный вами код не может запускаться и не имеет большого смысла. Эти переменные не определены: 'ser, rfWaterLevelTemp, key'. Вы используете 'rfWaterLevel' как имя функции и имя локальной переменной (а не ошибку, но плохой стиль). Переменная 'data' никогда не используется (а не ошибка, но бессмысленно). –

+0

Попробуйте 'conn = httplib.HTTPConnection (" api.thingspeak.com:80 ", timeout = 5)', чтобы подтвердить, что время ожидания запроса и 'headers' должны заканчиваться на'} '. – shiva

ответ

0

Значение rfWaterLevel не обновляется, потому что вы его не обновляете. Каждый раз, когда вы звоните rfWaterLevel (функция) вы выполнить эту инструкцию:

rfWaterLevel = float(rfWaterLevelTemp[4])

Тогда вы делаете что-то с этим значением, но не показывают, где rfWaterLevelTemp[4] приходит. Если это не изменится где-то, это будет всегда одно и то же. Вы будете отправлять одно и то же значение снова и снова. Возможно, вы имели в виду, чтобы написать:

rfWaterLevel = float(rfWaterLevelArray[4])

который я думаю, было бы отправить последние данные, которые вы получили от последовательного порта.

+0

Извините, я продолжаю печатать опечатки (так как этот код находится в моем малине pi, мне пришлось копировать его и т. Д.), Но теперь я редактировал код, и у него не должно быть опечаток. Это то, что я имел в виду, и это то, что я сделал. Итак, любые идеи о том, почему он все еще блокирует обновление массива? (Определенно не сторона передатчика ВЧ, так как она отправляет все правильно, и я тоже получаю ее правильно. Кроме того, когда я запускаю свой код без отправки его по облаку, переменная 'rfWaterLevel' обновляется так часто, как отправляются данные in. – Verglas

+0

Когда вы используете слово «block» или «freeze», для меня подразумевается, что программа перестает выполняться в строке 'conn.request'.Но вы также продолжаете говорить, что переменная «rfWaterLevelVal» не изменяется, поэтому, я думаю, я не понимаю эту проблему. Вы говорите, что rfWaterLevelVal меняет, когда вы не передаете облако, как будто вызов функции conn.request волшебным образом возвращает его к исходному значению. Это имеет нулевой смысл. Откуда вы знаете, когда он меняется, а когда нет? Я бы вставлял инструкцию print сразу после строки conn.request и печатал значение «params». –

+0

Хорошо объяснять подробно, как я знаю, что значения меняются. Данные, отправляемые с другого устройства через RF, являются данными уровня воды. Таким образом, данные уровня воды изменяются по мере изменения уровня воды. Я изменяю уровень воды и данные, отправляемые изменениями (проверяется через последовательный монитор на другом компьютере). Когда я запускаю код без всей части передачи облака, полученные данные реплицируют отправленные данные, которые я хочу. Однако, когда я запускаю передачу облака, rfWaterLevelVal не обновляется после получения начального rfWaterLevelVal. Это та часть, с которой я запутался. – Verglas