使用Python从Arduino保存数据-数据丢失
在web的帮助下,我创建了一个代码,从Arduino uno收集数据,并将其保存到csv文件中。 收集的数据是MEMS加速度计的原始值 代码中的问题是,如果终止Python,我经常会丢失很多数据(如果不是全部的话)。我注意到,在一个随机的时间,输出csv文件有零字节。 临时解决方案是启动Arduino的“串行监视器”。这样可以保存大部分测量数据使用Python从Arduino保存数据-数据丢失,python,pandas,arduino,Python,Pandas,Arduino,在web的帮助下,我创建了一个代码,从Arduino uno收集数据,并将其保存到csv文件中。 收集的数据是MEMS加速度计的原始值 代码中的问题是,如果终止Python,我经常会丢失很多数据(如果不是全部的话)。我注意到,在一个随机的时间,输出csv文件有零字节。 临时解决方案是启动Arduino的“串行监视器”。这样可以保存大部分测量数据 import serial import time import csv import numpy as np import pandas as pd
import serial
import time
import csv
import numpy as np
import pandas as pd
timeHr = []
timeT = []
mem1xD = []
mem1yD = []
mem1zD = []
#
mem2xD = []
mem2yD = []
mem2zD = []
arduinoData = serial.Serial('COM4',9600)
df = pd.DataFrame({
'timeHr':0,
'timeT':0,
'mem1xD':0,
'mem1yD':0,
'mem1zD':0,
'mem2xD':0,
'mem2yD':0,
'mem2zD':0,
},
index=[0]
)
while True:
while (arduinoData.inWaiting()==0):
pass
arduinoString = arduinoData.readline().decode("utf-8")
dataArray = arduinoString.split(",")
timehr = dataArray[0]
time = float(dataArray[1])/1000
mem1x = float(dataArray[2])
mem1y = float(dataArray[3])
mem1z = float(dataArray[4])
#
mem2x = float(dataArray[5])
mem2y = float(dataArray[6])
mem2z = float(dataArray[7])
timeHr.append(timehr)
timeT.append(time)
mem1xD.append(mem1x)
mem1yD.append(mem1y)
mem1zD.append(mem1z)
#
mem2xD.append(mem2x)
mem2yD.append(mem2y)
mem2zD.append(mem2z)
df = pd.DataFrame({
'timeHr':timeHr,
'timeT':timeT,
'mem1xD':mem1xD,
'mem1yD':mem1yD,
'mem1zD':mem1zD,
'mem2xD':mem2xD,
'mem2yD':mem2yD,
'mem2zD':mem2zD,
}
)
df.to_csv(r'time4.csv')
您需要将新数据附加到数据帧中。将
pd.Dataframe.to_csv
中的mode='a'
传递到将允许您执行此操作
import time
tStart = str(time.time()).split('.')[0]
fileOut = tStart+'.csv'
while True:
while (arduinoData.inWaiting()==0):
pass
arduinoString = arduinoData.readline().decode("utf-8")
dataArray = arduinoString.split(",")
timehr = dataArray[0]
time = float(dataArray[1])/1000
mem1x = float(dataArray[2])
mem1y = float(dataArray[3])
mem1z = float(dataArray[4])
#
mem2x = float(dataArray[5])
mem2y = float(dataArray[6])
mem2z = float(dataArray[7])
timeHr.append(timehr)
timeT.append(time)
mem1xD.append(mem1x)
mem1yD.append(mem1y)
mem1zD.append(mem1z)
#
mem2xD.append(mem2x)
mem2yD.append(mem2y)
mem2zD.append(mem2z)
df = pd.DataFrame({
'timeHr':timeHr,
'timeT':timeT,
'mem1xD':mem1xD,
'mem1yD':mem1yD,
'mem1zD':mem1zD,
'mem2xD':mem2xD,
'mem2yD':mem2yD,
'mem2zD':mem2zD,
}
)
df.to_csv(fileOut,mode='a', header=False)
@KEVEER确实是这样。但现在它不断地将以前的列表添加到新列表中,使csv文件在几秒钟后变得非常大。我无法附加要查看的文件。但是关于不丢失数据的一般想法是好的。@ManuelCalavera我已经编辑了代码,以创建一个新的文件,每次代码运行时都使用以秒为单位的历元时间作为文件名。这应该可以避免csv文件变得太大的问题。此外,您可以尝试降低传感器的采样率。谢谢。很多代码正在运行,但现在我在查找文件时遇到问题。我想我把事情搞砸了。是的,采样率会减少数据量,但有一段时间我每毫秒需要一个数据点。找到了。它稍微小一点,但它不断地在旧的读数上附加新的读数,而不是在旧的读数上。我认为问题出在“while”循环的某个地方。