簡體   English   中英

用Python將Arduino的實時數據寫入CSV

[英]Writing live data from an Arduino to a CSV in Python

我正在使用Python 3.5,嘗試將實時數據打印到CSV進行后期處理時遇到了一些麻煩。 我正在使用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語句使用上下文管理器來確保“無論發生什么事情都會發生”。 在這種情況下,它確保在with塊結束時立即關閉文件。 這具有為每次循環迭代創建一個文件(名為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() ,請注意,您也可以選擇在每次迭代時都使用outfile.flush() 該文件將在每個寫入的換行符或內部緩沖區已滿時刷新其未寫入的緩沖區,因此請嘗試是否需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM