ich habe zurzeit ein Programm laufen, dass Messwerte aufnimmt und auch abspeichert. Mein Problem ist, dass teilweise zwischen den Zeilen kleinere Zeitsprünge (~0,1) Sekunden. Da meine Messwerte normalerweiser mit einer Frequenz von 300 Hz aufgenommen werden ist dies schon ein Problem.
Zwischen den schreiben der Zeilen habe ich folgende Zeile stehen, damit das Abspeichern der Zeiten in regelmäßigen Abständen passiert:
Code: Alles auswählen
sleep((1/Datenrate)-((time.time() - starttime) % (1/dataRate)))
Deshalb wollte ich fragen ob es einen Weg gibt, dem Programm eine höhere Priorität zuzuordnen. Das Programm wird automatisch mittels Timer Unit beim Starten des RPi gestartet.
Weiß jemand von euch was ich dagegen machen kann? Hier noch mein ganzes Programm:
Code: Alles auswählen
#Einbinden der genutzten Bibliotheken
import serial, sys, struct, fcntl, errno, traceback
import struct
import RPi.GPIO as GPIO
import csv # Anpassung DP
from time import strftime, sleep
from os import system
import time
from datetime import datetime
import referenz2
def f_MesswertEmpfangen():
messwerte = ("leer",)
MW_Erhalten = False
ZeitpunktMWEnde = ("leer")
# Auslesen des Praefix-Bytes
praefix = verbindung.readline(1)
praefixUSB = verbindungUSB.readline(1)
praefix = praefix.encode("hex")
praefixUSB = praefixUSB.encode("hex")
#Auswertung der Messwerte
if praefix == "aa":
while True:
praefixUSB = verbindungUSB.readline(1)
praefixUSB = praefixUSB.encode("hex")
if praefixUSB == "aa":
identifier = verbindung.readline(1)
identifierUSB = verbindungUSB.readline(1)
identifier = identifier.encode("hex")
identifierUSB = identifierUSB.encode("hex")
break
if identifier == "15" and identifierUSB == "15":
rest = verbindung.read(26)
restUSB = verbindungUSB.read(26)
rest = rest.encode("hex")
restUSB = restUSB.encode("hex")
Antwort = praefix + identifier + rest
AntwortUSB = praefixUSB + identifierUSB + restUSB
if len(Antwort) == 56 and len(AntwortUSB) == 56:
ZeitpunktMWAnfang = (datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f'))
ch1 = byte_to_value(Antwort[6:14], "float")
ch2 = byte_to_value(Antwort[14:22], "float")
ch3 = byte_to_value(Antwort[22:30], "float")
ch4 = byte_to_value(Antwort[30:38], "float")
ch5 = byte_to_value(Antwort[38:46], "float")
ch6 = byte_to_value(Antwort[46:54], "float")
ch7 = byte_to_value(AntwortUSB[6:14], "float")
ch8 = byte_to_value(AntwortUSB[14:22], "float")
ch9 = byte_to_value(AntwortUSB[22:30], "float")
ch10= byte_to_value(AntwortUSB[30:38], "float")
ch11= byte_to_value(AntwortUSB[38:46], "float")
ch12= byte_to_value(AntwortUSB[46:54], "float")
messwerte = ((ZeitpunktMWAnfang, ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12),)
MW_Erhalten = True
ZeitpunktMWEnde = (datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f'))
return MW_Erhalten, messwerte, ZeitpunktMWEnde
def antwort_empfangen(verbindung):
var_routine = True
while (var_routine == True) :
praefix = verbindung.readline(1) # lese praefix
praefix = praefix.encode("hex") # string to hexstring
if praefix == "aa":
identifier = verbindung.readline(1) # lese identifier
identifier = identifier.encode("hex") # identifier: string to hexstring
if (identifier != 0x15): # Identifier vergleichen
rest = verbindung.readline(int(identifier)-0x50+2) # lese Rest des strings
rest = rest.encode("hex") # Rest: string to hexstring
Antwort = praefix + identifier + rest # string zusammensetzen
var_routine = False
return Antwort
def byte_to_value(daten, typ):
if typ == "float": # uint 32 Byte
Multiplikator = [268435456,16777216,1048576,65536,4096,256,16,1]
MW_list = []
for i in range(len(Multiplikator)):
MW_list.append(int(daten[i:(i+1)], 16))
MW = 0
for k in range(len(Multiplikator)):
MW += ( MW_list[k] * Multiplikator[k] )
if typ == "float":
MW = struct.pack("I", MW)
MW = struct.unpack("f", MW)[0]
return MW
if __name__ == '__main__':
GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(12, GPIO.OUT)
GPIO.output(12,0)
starttime = time.time()
# Verbindung UART-Shield
verbindung = serial.Serial('/dev/ttyAMA0', 230400, timeout=1)
verbindung.isOpen()
#Verbindung zu USB Schittstelle
verbindungUSB = serial.Serial('/dev/ttyUSB0', 230400, timeout=1)
verbindungUSB.isOpen()
sleep(0.5)
verbindung.write(chr(0xAA)+chr(0x90)+chr(0x23)+chr(0x85)) # stop transmission
Antwort = antwort_empfangen(verbindung)
print "serielle Verbindung aufgebaut"
verbindungUSB.write(chr(0xAA)+chr(0x90)+chr(0x23)+chr(0x85))
AntwortUSB = antwort_empfangen(verbindungUSB)
print "USB Verbindung aufgebaut"
sleep(0.5)
dataRate = 333.0 #Datenrate des USV-Shields einstellen
verbindung.write(referenz2.Befehl(verbindung,"WriteDataRate", [dataRate]))
Antwort = antwort_empfangen(verbindung)
verbindungUSB.write(referenz2.Befehl(verbindungUSB,"WriteDataRate", [dataRate]))
AntwortUSB = antwort_empfangen(verbindungUSB)
verbindung.write(chr(0xAA)+chr(0x90)+chr(0x78)+chr(0x85)) #Reset Device
sleep(0.5)
verbindungUSB.write(chr(0xAA)+chr(0x90)+chr(0x78)+chr(0x85))
sleep(0.5)
verbindung.write(chr(0xAA)+chr(0x90)+chr(0x23)+chr(0x85))
Antwort = antwort_empfangen(verbindung)
sleep(0.5)
verbindungUSB.write(chr(0xAA)+chr(0x90)+chr(0x23)+chr(0x85))
AntwortUSB = antwort_empfangen(verbindungUSB)
verbindung.write(chr(0xAA)+chr(0x90)+chr(0x24)+chr(0x85)) # start transmission
verbindungUSB.write(chr(0xAA)+chr(0x90)+chr(0x24)+chr(0x85))
print("Start der Messung:" + (datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')))
print ("Messung gestartet")
GPIO.output(12,1) #Kontroll LED einschlten
try:
while True:
dateiname = ("/media/pi/MP/MessungUSB/" +datetime.now().strftime('%Y%m%d')+"_meas_"+datetime.now().strftime('%H%M') + ".csv")
system('touch '+ dateiname) #Datei erstellen
system('sudo rm ' + dateiname)
csv_file = open(dateiname,'a') #Datei beschreiben
Zaehler_Zeilen = 0
while Zaehler_Zeilen < 500000: #Maximalzahl der Zeilen festlegen
bool_MW_Erhalten = False
bool_MW_Erhalten, float_Messwerte, string_ZeitpunktMWENDE = f_MesswertEmpfangen()
if bool_MW_Erhalten == True: # wenn ein Messwert empfangen wurde wird eine Zeile in der .csv Datei beschrieben
for row in float_Messwerte[0]:
csv_file.write(str(row)+";")
csv_file.write(string_ZeitpunktMWENDE)
csv_file.write("\n")
sleep( (1/dataRate) - ((time.time() - starttime) % (1/dataRate)))
if GPIO.input(13)==GPIO.HIGH:
raise Exception("Knopfdruck") #Bei Knopfdruck Exception auswerfen und so Program beenden
except KeyboardInterrupt:
verbindung.close()
verbindungUSB.close()
GPIO.output(12,0) #Kontroll LED ausschalten
GPIO.cleanup()
print "\nProgrammende"
#sleep(10.0)
#system('sudo shutdown now') #RPi herunterfahren
Mit freundlichen Grüßen
Matthias