【问题标题】:Saving data from Arduino using Python - loss of data使用 Python 从 Arduino 保存数据 - 数据丢失
【发布时间】:2020-01-21 18:11:45
【问题描述】:

在网络的帮助下,我创建了一个从 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')

【问题讨论】:

    标签: python pandas arduino


    【解决方案1】:

    您需要将新数据附加到数据框中。在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”循环中。
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2017-07-31
    • 2017-05-08
    • 2018-09-16
    相关资源
    最近更新 更多