我对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
答案 0 :(得分:1)
您的问题的答案在您发布的输出中。正如您所看到的,您发布的输出的最后一行是[],它是一个空列表,并且没有索引为0的元素。这意味着您尝试抓取的索引为0的项目不可用或者&#39 ;超出范围&#39;。
你必须改变你的状态,所以在“停止”之后循环停止。正在阅读。
答案 1 :(得分:0)
看起来你的Arduino在停止后发送了一个空行,你的脚本没有预料到 - 你的脚本希望每一行都有'start','stop'或list元素。您可以查看Arduino上发生的事情并进行修复,或者更新脚本以忽略空行 - 在val = ...
行之后添加
if len(val) == 0:
continue