使用Python从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

在web的帮助下,我创建了一个代码,从Arduino uno收集数据,并将其保存到csv文件中。 收集的数据是MEMS加速度计的原始值

代码中的问题是,如果终止Python,我经常会丢失很多数据(如果不是全部的话)。我注意到,在一个随机的时间,输出csv文件有零字节。 临时解决方案是启动Arduino的“串行监视器”。这样可以保存大部分测量数据

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”循环的某个地方。