Seite 1 von 1
Raspberry Pi 4 als Datenlogger
Verfasst: Montag 5. Juni 2023, 16:18
von basti_1308
Hallo zusammen,
ich bin neu hier im Forum und ein Einsteiger was die Raspberry bzw. Python Programmierung angeht. Mein Ziel ist es, Sensordaten über" /dev/ttyUSB0" mit 100 Hz auszulesen und in ein csv.file zu schreiben. Mir gelingt es die Daten auszulesen, jedoch habe ich folgendes Problem:

Dies ist ein Ausschnitt aus dem csv.file. Von Zeile 89 auf 90 gibt es ein Sprung von ca. 8ms. Dieser ist mir nicht erklärbar, da ich eigentlich erwarte, dass wie in den anderen Zeilen jede Millisekunde eine neue Datenlinie geschrieben wird. (ich habe somit nur 92 statt 100 Einträge pro Sekunde). Dieser 8ms Sprung findet nicht immer zur gleichen Zeit statt sondern taucht pro Sekunde einmal willkürlich auf.
Der verwendete Code ist folgender:
Code: Alles auswählen
import serial
import datetime
import time
ser = serial.Serial('/dev/ttyUSB0', 115200)
logfile = open('uart_pogger.csv', 'w')
buffer = ''
while True:
data = ser.read().decode() # Dekodieren Sie die empfangenen Bytes
if data == '\n':
timestamp = datetime.datetime.now().strftime('%H:%M:%S:%f')
log_entry =f'{timestamp}: {buffer}\n'
logfile.write(log_entry)
logfile.flush()
# Buffer zurücksetzen
buffer = ''
else:
buffer += data
# Logdatei und serielle Verbindung schließen
logfile.close()
ser.close()
Über Hilfe oder Ideen, wie ich es hinbekomme, die Daten mit den gewollten 100 Hz (d.h. ohne Zeitsprünge) zu loggen, wäre ich sehr dankbar.
Vielen Dank schonmal.
Grüße
Basti
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Montag 5. Juni 2023, 16:35
von __blackjack__
Es gilt weiterhin was ich hier dazu geschrieben hatte:
https://forum-raspberrypi.de/forum/thre ... post561288
Edit: Einrückung ist per Konvention vier Leerzeichen pro Ebene, keine Tabulatorzeichen.
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Montag 5. Juni 2023, 17:14
von basti_1308
leider habe ich nicht alles verstanden. Bisher habe ich den Code wiefolgt angepasst:
Code: Alles auswählen
import serial
import csv
import datetime
import time
# Serielle Verbindung konfigurieren
ser = serial.Serial('/dev/ttyUSB0', 115200)
buffer=''
with open('uart_pogger.csv','w') as csv_file:
csv_writer = csv.writer(csv_file)
csv_writer.writerow(['Timestamp', 'Data'])
while True:
# Daten aus dem UART lesen
data = ser.read().decode()
if data == '\n':
# Datenende erreicht, Daten in die CSV-Datei schreiben
timestamp = datetime.datetime.now().strftime('%H:%M:%S:%f')
csv_writer.writerow([timestamp, buffer])
csv_file.flush()
# Buffer zurücksetzen
buffer = ''
else:
buffer += data
was sollte deiner Meinung nach noch verbessert werden?
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Montag 5. Juni 2023, 17:16
von __deets__
Statt read und dem Händischen geprüfe auf \n einfach readline verwenden. Das spät auch Zeit. Wenn das nicht reicht, muss man mehr einsteigen, was das für ein Sensor ist.
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Montag 5. Juni 2023, 17:27
von basti_1308
Ich habe nun den buffer entfernt, readline verwendet. Allerdings tritt das obige Problem mit den 8ms weiterhin auf.
Code: Alles auswählen
import serial
import csv
import datetime
import time
# Serielle Verbindung konfigurieren
ser = serial.Serial('/dev/ttyUSB0', 115200,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE)
with open('uart_pogger.csv','w') as csv_file:
csv_writer = csv.writer(csv_file)
# Header-Zeile schreiben
csv_writer.writerow(['Timestamp', 'Data'])
while True:
# Daten aus dem UART lesen
data = ser.readline().decode() # Dekodieren Sie die empfangenen Bytes
timestamp = datetime.datetime.now().strftime('%H:%M:%S:%f')
csv_writer.writerow([timestamp, data])
csv_file.flush() # Puffer leeren, um sicherzustellen, dass die Daten in die Datei geschrieben werden
Bei dem Sensor handelt es sich um ein Hitzdraht. folgende Infos wurden mir dazu zur Verfügung gestellt:
Baudrate:115200
Datenbits: 8
Stop-Bits: 1
Parity: None
Also 115200-8N1.
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Montag 5. Juni 2023, 22:17
von __deets__
Na und was schickt der genau für Daten? Woher weißt du, dass das 100/s sind?
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Dienstag 6. Juni 2023, 08:14
von imonbln
Auch noch mal von mir:
Dir fehlen 8 ms, warum ist das ein Problem? Welchen [Petro]chemischen Prozess musst du Regeln, dass es Kritisch wird?
Wenn dein Sensor zum Beispiel Temperatur misst, spielen die 8 ms keine Rolle, bei Swimmingpools würde es wahrscheinlich sogar reichen, wenn du nur 1 pro Minute misst. Bei der Einparkhilfe sieht die Sache schon etwas anders aus, du siehst also es kommt darauf an, ob sich der Aufwand lohnt, denn 8 ms nachzujagen.
Grundsätzlich können die 8 ms durch mehrere Faktoren entstehen, mir fällt spontan ein:
- Der USB Serial Treiber wird sicher nicht den USB in Realtime Mode betreiben
- Linux (ohne RT-patches) kann keine Echtzeit, ggf. macht der Kernel da gerade was anderes. Vielleicht kannst du das untersuchen, indem du mit dem Kommando "nice" Python etwas mehr Rechenzeit gibst.
- Python ist ein Interpreter, der wird sich auch mal um sich selbst drehen, vielleicht arbeitet da gerade der Garbage Colletor, im schlimmsten fall eigenen sich vielleicht Sprachen wie C/C++ oder Rust besser, aber da hat man dann andere Probleme zu lösen.
Grundsätzlich musst du durch Messen und anpassen herausbekommen, was dein System blockiert. Wahrscheinlich wird Heisenberg dafür sorgen, dass dein System während des Messens sich komplett anders verhält. Oder du sagst, das ist nicht schlimm für meinen Prozess und nutz das tolle Wetter für etwas anders.
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Dienstag 6. Juni 2023, 08:19
von __deets__
@imonbln: das sind alles sehr richtige Punkte. Das es aber so (angeblich zumindest) deterministisch 8ms sind, finde ich etwas seltsam. Und es ist ziemlich lang. Solche Werte kenne ich von bei hoher CPU last belagerten Locks. Aber das liegt hier ja erstmal nicht vor.
Re: Raspberry Pi 4 als Datenlogger
Verfasst: Dienstag 6. Juni 2023, 19:36
von imonbln
@__deets__,
Ja, irgendwie ist das alles noch etwas komisch und unklar. Vielleicht hat auch der Sensor selbst das Delay.
Da hilft nur messen, verstehen oder sagen das ist kein Problem. Aber mit den hier vorliegenden Informationen, ist das alles nur raten.