Python随机抛出超出范围的错误

时间:2018-02-22 14:54:13

标签: python arduino

我对Python比较陌生,我正在尝试绘制一个从Arduino收到的测量列表。

我面临的问题是,有时我会出现超出范围的错误,它大部分时间都有效,但是我得到错误的时间是1/4。

这是我的代码:

import serial                    
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

# fuer Windos Nutzer sollte der Pfad
# COM4 oder aehnlich sein
# Baudrate muss der im arduino Programm entsprechen
# container fuer Messwerte
v = []
t = []

# Flag fuer das Startsignal

#####################################
# Zeichne Messwerte vom arduino auf #
#####################################
for lists in range(0,5):
    v.append([])
    t.append([])
    s = serial.Serial('COM5', baudrate=115200)
    start = False

    while True:
        val = s.readline().decode('ascii',errors='ignore').split()
        ## wenn Signalstring detektiert wird
        ## packe Daten in Container

        if start and val[0] != 'stop' and val[0] != 'start':
           v[lists].append(float(val[3])/1024 * 5)
           t[lists].append(float(val[1])/1000)

        ## wenn du noch nicht angefangen hast und das Kommando
        ## zum Anfangen bekommen hast: fang an
        print(val)
        if not start and (val[0] == 'start'):
            start = 1

        ## wenn du schon angefangen hast und das Kommando
        ## zum aufhoeren bekommen hast: hoer auf
        if start and val[0] == 'stop':
            break

    s.close()

o = np.array(v)
z = np.array(t)

print(o)

y = np.mean(o,axis = 0, out=None)
print("\n")

print(y)








### visualisiere die Daten
plt.figure(figsize=(18,9))     # groesse des Plots auf dem Schirm
plt.plot(z[1],y,'b.')          # mit blauen punkten 
plt.grid()                     # mit Gitter
plt.xlabel('t [milliseconds]') # mit Beschriftung der Ordinate
plt.ylabel('voltage [volts]')  # mit Beschriftung der Abzisse

plt.figure(figsize=(18,9))     # groesse des Plots auf dem Schirm
plt.plot(z[1],o[1],'r.')       # mit blauen punkten 
plt.grid()                     # mit Gitter
plt.xlabel('t [milliseconds]') # mit Beschriftung der Ordinate
plt.ylabel('voltage [volts]')  # mit Beschriftung der Abzisse

plt.show()                     # zeig es

在这里,我得到了解码数据传输的一部分,就在错误发生之前:

['start']
['time:', '216', 'v:', '930']
['time:', '344', 'v:', '675']
['time:', '464', 'v:', '408']
['time:', '584', 'v:', '345']
['time:', '704', 'v:', '315']
.....
['time:', '98312', 'v:', '927']
['time:', '98832', 'v:', '927']
['stop']
[]
Traceback (most recent call last):
File "C:\Users\maxia\OneDrive\privat\programieren\visual 
studio\phyton\arduino1_phyton\arduino1_phyton\arduino1_phyton.py", line 36, 
in <module>
if not start and (val[0] == 'start'):
IndexError: list index out of range

2 个答案:

答案 0 :(得分:1)

您的问题的答案在您发布的输出中。正如您所看到的,您发布的输出的最后一行是[],它是一个空列表,并且没有索引为0的元素。这意味着您尝试抓取的索引为0的项目不可用或者&#39 ;超出范围&#39;。

你必须改变你的状态,所以在“停止”之后循环停止。正在阅读。

答案 1 :(得分:0)

看起来你的Arduino在停止后发送了一个空行,你的脚本没有预料到 - 你的脚本希望每一行都有'start','stop'或list元素。您可以查看Arduino上发生的事情并进行修复,或者更新脚本以忽略空行 - 在val = ...行之后添加

if len(val) == 0:
    continue