2016-07-19 6 views
0

그래서이 코드는 RF 수신기를 통해 지속적으로 데이터를 수신합니다.python에서 request()가 내 코드에서 보내려는 변수의 업데이트를 차단하는 것 같습니다

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

데이터를 보내고 작업을 업데이트하는 측면에서 작동합니다. 그러나 큰 결함이 있습니다. 송신중인 rfWaterLevelVal 변수가 수신중인 데이터에 따라 전혀 갱신되지 않습니다. 따라서 처음에받은 rf 데이터가 30이므로 rfWaterLevelVal을 30으로 만들면 다음 데이터 라운드는 40이고 전송되는 데이터는 여전히 30으로 고정되어 있습니다.

코드를 한 줄씩 주석 처리하여 이런 일이 만들고 이것이 rfWaterLevelArray & rfWaterLevelVal 변수를 갱신에 "동결"것처럼 보이는 것은 ...

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

내 rfWaterLevelArray 또는 rfWaterLevelVal 변수가이 후 전혀 업데이트되지 않는 이유에 도움이 라인에서 발생 코드가 한 번 실행됩니까?

미리 감사드립니다.

+0

답변이 없지만 Content-Type 헤더에 오타가 있습니다. – Garett

+1

제안 : 프로그램을 변경하는 줄을 주석 처리하는 대신 print 문을 삽입하십시오. 제시 한 코드는 실행될 수 없으며별로 의미가 없습니다. 이 변수들은 정의되지 않았다 :'ser, rfWaterLevelTemp, key'. 'rfWaterLevel'을 함수 이름과 로컬 변수 이름으로 사용하고 있습니다 (버그는 아니지만 나쁜 스타일 임). 변수'data'는 결코 사용되지 않습니다 (버그는 아니지만 무의미 함). –

+0

'conn = httplib.HTTPConnection ("api.thingspeak.com:80", timeout = 5)'을 시도하여 요청 시간이 초과되고'headers'가'}'로 끝나야하는지 확인하십시오. – shiva

답변

0

rfWaterLevel의 값은 업데이트하지 않으므로 업데이트되지 않습니다.

rfWaterLevel = float(rfWaterLevelTemp[4])

그런 다음 그 값으로 뭔가를하지만, rfWaterLevelTemp[4] 어디에서 오는지 당신은 표시되지 않습니다 : 당신이 (기능) rfWaterLevel 호출 할 때마다이 문을 실행합니다. 어딘가에서 변경되지 않는 한, 항상 동일합니다. 당신은 같은 가치를 반복해서 보낼 것입니다. 아마 당신은 쓰는 의미 : 당신이 직렬 포트에서 가져온 최신 데이터를 보낼 것이라고 생각

rfWaterLevel = float(rfWaterLevelArray[4])

합니다.

+0

죄송합니다. 오타를 입력하고 있습니다. (이 코드는 내 나무 딸기 파이에 있으며, 복사해야합니다 ... 등)하지만 지금 코드를 편집 했으므로 오타가 없어야합니다. 그것이 내가 의미하는 바이며 그것은 내가 한 일입니다. 그래서 왜 여전히 배열의 업데이트를 차단하는지에 대한 아이디어가 있습니까? (확실히 rf 송신기 측은 올바르게 작동하지 않기 때문에 올바르게 수신하고 있습니다. 또한 클라우드를 통해 코드를 전송하지 않고 코드를 실행하면 'rfWaterLevel' 변수가 데이터가 자주 전송 될 때마다 업데이트됩니다 in. – Verglas

+0

"block"또는 "freeze"라는 단어를 사용할 때, 당신은 프로그램이 conn.request 줄에서 실행을 멈춘다는 것을 암시한다.그러나 변수 "rfWaterLevelVal"이 변하지 않는다는 것을 계속해서 말하고 있으므로 문제에 대해 명확하지 않습니다. 당신은 rfWaterLevelVal이 클라우드로 전송하지 않을 때 conn.request 함수 호출이 마술처럼 원래의 값으로 되돌릴 때처럼 변하지 않는다고 말합니다. 그것은 제로 센스를 만듭니다. 그것이 언제 변화하고 언제 그렇지 않은지 어떻게 알 수 있습니까? conn.request 줄 바로 뒤에 print 문을 삽입하고 "params"값을 인쇄합니다. –

+0

Ok는 값이 어떻게 변하는지를 자세히 설명합니다. RF를 통해 다른 장치에서 전송되는 데이터는 수위 데이터입니다. 따라서 수위 변화에 따라 수위 데이터가 변경됩니다. 수위를 변경하고 전송되는 데이터를 변경합니다 (다른 컴퓨터의 직렬 모니터를 통해 확인). 전체 클라우드 전송 부분없이 코드를 실행하면받은 데이터가 원하는 데이터를 복제합니다. 그러나 클라우드 전송을 시작하면 초기 rfWaterLevelVal을받은 후 rfWaterLevelVal이 업데이트되지 않습니다. 그것이 내가 혼란스러워하는 부분입니다. – Verglas