python和arduino:列表索引超出范围错误

时间:2015-06-02 06:59:02

标签: python indexing arduino

所以我试图从我的arduino获取一些资源值和一些id,我无法弄清楚如何解决这个问题。 我没有玩python,这是我的第一次,所以它必须是一件容易的事......

这是我的python程序

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
        char line[40];
        unsigned short bin;
        char operator[10], destination[10], source1[10], source2[10];

        FILE *file; if((file = fopen(argv[1], "r")) == NULL)
        {
                printf("IO Error, please specify a file\n");

        }
        else{
        FILE *file = fopen(argv[1], "r");
        while(fgets(line, 40, file) != NULL){
        sscanf(line, "%s %[^,],%[^,],%s",operator,destination,source1,source2);
        if(strcmp(operator,"add")==0){
                bin = 0b0001000000000000;
        }
        if(strcmp(operator,"and")==0){
                bin = 0b0101000000000000;
        }
        bin+=(destination[1]-'0') * 0b1000000000;
        bin+=(source1[1]-'0') * 0b1000000;
        char *dec=strstr(source2,"r");
        if (dec){
        bin+=(source2[1] - '0');
        }
        else{

        bin+=0b100000;
        int source2Dec ;
        sscanf(source2,"%d",&source2Dec);
        bin+=(source2Dec);
        }

        printf("%x\n", bin);
        }
        }
       }

这是错误:

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

这是我试图发布的arduino数据

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

4 个答案:

答案 0 :(得分:1)

IndexError: list index out of range

暗示您正在读取过去的数组边界。令牌中的元素少于6个。

答案 1 :(得分:0)

你的行[: - 5]将剥离很多结束(我不知道为什么你这样做)。结果,没有6个字段被|分隔。 split()调用给你少于六个结果,然后你尝试访问令牌[5](以及令牌[4])因为那些不存在而失败。

一般情况下,您还应该检查以确保列表是您想要的大小,否则任何格式错误的数据都可能导致程序崩溃。

答案 2 :(得分:0)

tokens = line [: - 5] .split(&#39; |&#39;)
TO:
tokens = line [: - 2] .split(&#39; |&#39;)

答案 3 :(得分: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()用于删除尾随空格(如果有)。