2017-10-18 10 views
0

J'utilise Python 3.5 et j'ai un peu de mal à essayer d'imprimer mes données en direct sur un CSV pour le post-traitement. J'utilise un Arduino pour recueillir des données à partir d'une jauge de contrainte et d'un capteur photo pour une mise à jour en direct de Dyno pour l'équipe de mon école. Jusqu'à présent, j'ai réussi à imprimer la dernière ligne de données en format CSV, mais ce n'est pas suffisant.Écrire des données en temps réel d'un Arduino à un CSV en Python

Je l'ai besoin pour imprimer toutes ces données après que l'équipe a terminé leurs tests pour voir ce que leurs modifications ont fait pour le moteur. J'ai toutes les données pertinentes affichées dans un moniteur série, mais ce serait formidable pour eux s'ils pouvaient avoir les données pour passer en revue les tests précédents.

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() 

Répondre

1

Vous avez enveloppé votre code d'ouverture et de fermeture de fichier à l'intérieur de la boucle while: le bloc with. Pour une approximation de premier ordre, l'instruction with utilise un Context Manager pour s'assurer que "quelque chose se passe, quoi qu'il arrive". Dans ce cas, il s'assure que le fichier est fermé dès que le bloc with se termine. Cela a pour effet de créer un fichier nouveau (nommé DynaData.csv) pour chaque boucle d'itération, et donc les seules données qui survivent sont les dernières données écrites, une seule ligne de votre sortie CSV.

Notez que cela signifie que votre tentative de fermer le fichier:

outfile.close() 

est redondant au mieux, si l'interprète ne jette pas d'emblée une exception.

Si vous voulez écrire constamment le fichier en tant que données entre, placez votre boucle while à l'intérieur du bloc 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]) 

Pour être complet, notez que vous pouvez éventuellement outfile.flush() à chaque itération ainsi. Le fichier va vider son tampon non écrit à chaque nouvelle ligne écrite ou quand le tampon interne est plein de toute façon, expérimentez si vous en avez besoin ou si vous le souhaitez.

+0

Cela semblait avoir résolu mon problème, mais quand il enregistre les informations, il semble avoir un espace vide entre les lignes. Ce n'est pas un problème critique cependant d'avoir une feuille de calcul nette de toutes leurs données, je pense qu'il serait plus agréable de ne pas un espace entre chaque ligne. Par exemple, un ensemble d'échantillons comportant 20 points de données utiliserait 40 lignes. –

+0

Juste noté une erreur dans ce que je vous ai donné: déplacez le '= csv.writer (outfile)' à _outside_ de la boucle while. Évidemment pas nuisible, car cela a fonctionné, mais pas correct non plus. C'est la seule source de nouvelle ligne supplémentaire que je peux voir. Maintenant, il y a exactement une instruction qui écrit dans le fichier. Voir si cela résout votre problème? – hunteke

+0

Malheureusement, il n'y avait aucun changement dans le fichier de sortie avec ce changement, mais j'apprécie de savoir la bonne façon de faire cette partie d'un code. –