2016-06-30 1 views
0

Mein Controller empfängt Daten von einem Funkmodul über eine serielle Schnittstelle, er misst Temperatur und Luftfeuchtigkeit alle 1 Sekunde auf zwei Dezimalstellen und verwendet "a" als Zeitstempel. Zum Beispiel:In der Textdatei gespeicherte Daten sind inkonsistent

a21.12 65.43 
a21.13 65.40 

Hier ist der Code Ich verwende:

import serial 
import datetime 

connected = False 

locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3'] 

for device in locations: 
    try: 
     print "Trying...",device 
     ser = serial.Serial(device, 9600) 
     break 
    except: 
     print "Failed to connect on",device 

while not connected: 
    serin = ser.read() 
    connected = True 


with open('tempdata.txt', 'w') as text_file: 
    while 1: 
     if ser.read() is 'a': 
      text_file.write(datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')) 
      text_file.write(" ") 
     x = ser.read() 
     text_file.write(x) 
     text_file.flush() 

ser.close() 

Wenn ich meine Textdatei überprüfen danach das Ergebnis scheint jedes Mal anders zu sein. Wenn ich es für nur 2 oder 3 Sekunden laufen lasse, bekomme ich manchmal ein korrektes Ergebnis, manchmal bekomme ich nur die Feuchtigkeit, manchmal bekomme ich den Zeitstempel mit einer Nummer, die halbe Temperatur, halbe Luftfeuchtigkeit (wie 2.16.3) ist. Wenn ich es für mehr als ein paar Sekunden laufen lasse, ist die Datei einfach komplett leer.

Die Basis für meinen Code stammt von einer Frage, die zuvor hier gestellt wurde und es funktionierte gut, bis ich den Zeitstempelteil hinzufügte. Ich habe versucht, die Übertragungsrate von 9600 auf 4800 zu ändern, aber das hat nur die Zahlen in Müllzeichen verwandelt.

Ich betreibe dies auf einem Raspberry Pi 2 Modell B, so dass ich in kurzer Zeit zu viel davon verlangen könnte.

Antwort

1

Sie rufen zweimal read() auf und schreiben nur die Ausgabe des zweiten Anrufs. Ich kann mir nicht vorstellen, dass das deine Absicht ist.

Sie können diesen Abschnitt ändern:

with open('tempdata.txt', 'a') as text_file: 
    while 1: 
     content = ser.read() 
     if content is 'a': 
      text_file.write(datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')) 
      text_file.write(" ") 
     text_file.write(content) 
     text_file.flush() 
+0

Die zur Fixierung des Ausgangs wirklich gut funktioniert, danke dafür. Ich bekomme immer noch eine völlig leere Textdatei, wenn ich es für mehr als 3 oder 4 Impulse laufen lasse. – rambopanda

+0

Sie möchten wahrscheinlich den Modus ändern, um ''a'' – Nicarus

+0

anhängen Das tat es, danke nochmal – rambopanda