在 Python 中将实时数据从 Arduino 写入 CSV

Writing live data from an Arduino to a CSV in Python

我正在使用 Python 3.5,但在尝试将我的实时数据打印到 CSV 以进行 post 处理时遇到了一些麻烦。我正在使用 Arduino 从应变仪和光电传感器收集数据,以便为我的学校车队实时更新 Dyno。到目前为止,我已经设法将最后一行数据打印到 CSV 文件中,但这还不够。

在团队完成测试以查看他们的修改对引擎做了什么之后,我需要它来打印所有这些数据。我确实在串行监视器中显示了他们所有的相关数据,但如果他们能够获得用于审查以前测试的数据,那对他们来说会很棒。

import serial
import csv
import time
import numpy as np
import warnings
import serial
import serial.tools.list_ports

arduino_ports = [
    p.device
    for p in serial.tools.list_ports.comports()
    if 'Arduino' in p.description
]
if not arduino_ports:
    raise IOError("No Arduino found")
if len(arduino_ports) > 1:
    warnings.warn('Multiple Arduinos found - using the first')

Arduino = serial.Serial(arduino_ports[0])
Arduino.flush()
Arduino.reset_input_buffer()

start_time=time.time()
Distance = 0.5 # This is how long the lever arm is in feet

while True:
    while (Arduino.inWaiting()==0):
        pass
    try:
        data = Arduino.readline()
        dataarray = data.decode().rstrip().split(',')
        Arduino.reset_input_buffer()
        Force = float(dataarray[0])
        RPM = float (dataarray[1])
        Torque = Force * Distance
        HorsePower = Torque * RPM / 5252
        Run_time = time.time()-start_time
        print (Force , 'Grams',"," , RPM ,'RPMs',"," ,Torque,"ft-lbs",",", HorsePower, "hp", Run_time, "Time Elasped")
    except (KeyboardInterrupt, SystemExit,IndexError,ValueError):
        pass
    with open('DynoData.csv', 'w') as outfile:
        outfileWrite = csv.writer(outfile)
        outfileWrite.writerow([Force, RPM])

    outfile.close()

您已将打开和关闭文件的代码包装在 while 循环中:with 块。对于一阶近似,with 语句使用 上下文管理器 来确保 "something happens, no matter what"。在这种情况下,它确保文件在 with 块结束后立即关闭。这具有为每个循环迭代创建一个 new 文件(名为 DynaData.csv)的效果,因此唯一幸存的数据是最后写入的数据,一行你的 CSV 输出。

请注意,这意味着您尝试关闭文件:

outfile.close()

充其量是多余的,如果解释器没有直接抛出异常的话。

如果您想在数据进入时不断写入文件,请将 while 循环包含在 with open... 块中:

with open('DynoData.csv', 'w') as outfile:
    outfileWrite = csv.writer(outfile)
    while True:
        ...
        # code to collect your data omitted
        ...
        outfileWrite.writerow([Force, RPM])

为了完整起见,请注意您也可以在每次迭代时选择 outfile.flush()。该文件将在每次写入换行符或内部缓冲区已满时刷新其未写入的缓冲区,因此如果需要或想要这样做,请进行试验。