所以我试图从我的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
答案 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()
用于删除尾随空格(如果有)。