2015-06-02 78 views
0

所以我想從我的arduino獲得一些資源值和一些id,我不知道如何解決這個問題。 我還沒有玩過蟒蛇,這是我第一次,所以它必須是東西容易...蟒蛇和arduino:列表索引超出範圍err

這是我的Python程序

import serial 
import requests 
import time 
import json 

ser = serial.Serial('/dev/ttyACM0', 9600, timeout = 1) 

i = 0 
collected = [] 
while (i < 15): 
    line = ser.readline() 
    if (line[:3] == '***'): 
     #print line 
     line = line.strip('*') 
     tokens = line[:-5].split('|') 
     #print tokens 
     list_tuple = (float(tokens[0]) , float(tokens[1]), float(tokens[2]), int(tokens[3]), int(tokens[4]), int(tokens[5])) 

     #print list_tuple 
     collected.append(list_tuple) 

     i += 1 

avg_temp = 0 
avg_hum = 0 
avg_lum = 0 
id_t=0 
id_h=0 
id_l=0 
for c in collected: 
    avg_temp += c[0] 
    avg_hum += c[1] 
    avg_lum += c[2] 
    id_t = c[3] 
    id_h = c[4] 
    id_l = c[5] 

avg_temp = avg_temp/len(collected) 
avg_hum = avg_hum/len(collected) 
avg_lum = avg_lum/len(collected) 

print "AVT: %.2f AVH: %.2f AVL: %.2f" % (avg_temp, avg_hum, avg_lum) 
id_thing = id_t 
id_thing_h = id_h 
id_thing_l = id_l 
v_type = 'temperature' 
v_type_h = 'humidity' 
v_type_l = 'luminosity' 
# url = ..... 
#some http post requestes 
#.... 

time.sleep(10) 
print "Done" 
ser.close() 

這是錯誤:

Traceback (most recent call last): 
    File "ser.py", line 17, in <module> 
    list_tuple = (float(tokens[0]) , float(tokens[1]), float(tokens[2]), int(tokens[3]), int(tokens[4]), int(tokens[5])) 
IndexError: list index out of range 

這是Arduino的數據我嘗試發佈

while(1){ 

    float temp, humi; 
    int err; 
    if((err=dht11.read(humi, temp))==0) 
     { 

     Serial.println(); 

     Serial.print("***"); 
     Serial.print(temp); 
     Serial.print("|"); 
     Serial.print(humi); 
     Serial.print("|"); 
     Serial.print(ledPin); 
     Serial.print("|"); 
     Serial.print(id_temp); 
     Serial.print("|"); 
     Serial.print(id_hum); 
     Serial.print("|"); 
     Serial.print(id_lum); 
     Serial.println(); 
     } 
} 

回答

0

令牌=行[: - 5] .split( '|')
TO:
令牌=行[: - 2] .split( '|')

+0

恐怕這是不正確的 - 這可能只適用於你的特定用例,但不是解決問題的正確方法。如果你的'id_lum '<10,這是行不通的。 – gabhijit

+0

它會,b因爲我有「|」,做出分裂......謝謝。 :) ...這對我來說沒問題,所以我現在就會這樣。 – flori

1
IndexError: list index out of range 

意味着您正在讀取數組邊界。令牌中少於6個元素。

+0

現在我得到這個:'Traceback(最近呼叫最後一個): File「ser。(浮點(tokens [0]),float(tokens [1]),float(tokens [2]),int(tokens [3]),int(tokens [4])中的第17行, ),int(tokens [5])) ValueError:無效文字爲int()以10爲底:'' '我嘗試保存6個值...並不意味着我必須從-5開始? – flori

+0

ValueError是由於試圖將''(空字符串)強制轉換爲Int。任意一個標記,3,4,5是''或者文件中的最後一行需要轉義(通常由/ n後綴引起) 你應該使用try/catch來做任何你可能會失敗的事 – John

0

你的命令[: - 5]將會消除很多結局(我不確定你爲什麼這麼做)。因此,不存在由|分隔的6個字段。 split()調用給你的結果少於6個,然後你嘗試訪問令牌[5](和令牌[4])就會失敗,因爲這些不存在。

一般而言,您還應該檢查以確保列表與您想要的大小無關,否則任何格式錯誤的數據都可能導致程序崩潰。

0

也有人試圖回答這個問題 - 但我認爲基本的困惑沒有解決

line[:-5]將最後5個字符從線

刪除例如,如果你line'abcdefghijklm'然後line[:-5]會給'abcdefgh'

現在,讓我們看看你的adruino代碼下面具體行

Serial.print(id_lum) 

現在,每當這些值都大於99999,你是好的,但對於從10000到99999的值是要刪除的最後5位數字但要保留|,對於小於1000的值,事實上id_hum中的某些位也將被刪除。 (當然不是你想要的)。

一般而言,你只是沒有line[:-5]。那[-5]與你對6個領域感興趣的事實沒有任何關係。

所以,簡單地改變你的線 tokens = line[:-5].split('|')tokens = line.strip().split('|')

應該是所有你想要的。如果有的話,額外strip()是刪除後面的空格。

+0

我會牢記這一點。謝謝 。 – flori

相關問題