Raspberry Pi 4 als Datenlogger

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
basti_1308
User
Beiträge: 3
Registriert: Montag 5. Juni 2023, 15:49

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:
Bild
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
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
basti_1308
User
Beiträge: 3
Registriert: Montag 5. Juni 2023, 15:49

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?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
basti_1308
User
Beiträge: 3
Registriert: Montag 5. Juni 2023, 15:49

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na und was schickt der genau für Daten? Woher weißt du, dass das 100/s sind?
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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.
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

@__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.
Antworten