Hi,
Ich habe ein Pythonskript mit dem ich die seriellen Daten lese, die von einem Ceilometer kommen. Dieses ist per RS232 an einen serial-to-usb converter angebunden und dann mit dem Pi verbunden. Das auslesen mittels des Skriptes funktioniert einwandfrei, mit einer kleinen Einschraenkung.
In den gelesenen Daten zeigt sich nach einiger Zeit eine Timedrift. Das Skript schreibt jeden ankommenden serial stream in eine Textdatei. Vor jeden serial string holt es sich die Zeit und das Datum von der Systemzeit und schreibt diese davor.
Sagen wir der erste string hat den Timestamp "29.02.2016 11:30:25" und der naechste "29.02.2016 11:30:40". Soweit so gut, das passt alles, da die Daten alle 15 Sekunden gesendet werden.
Nur nach 24 Stunden durchgaengigen lesen der Daten, sehen die Timestamps so aus: "01.03.2016 11:30:22" und der naechste "01.03.2016 11:30:37". Obwohl die Sekunden genau den gleichen Wert haben sollte wie zuvor.
Mein erster verdacht war, das der Pi aus irgend einem Grund die Internetverbindung verliert und somit die Zeit langsam driftet, da die software clock im Pi einfach zu ungenau ist. Allerdings habe ich dies in den letzten 24 Stunden gecheckt. Der pi war ununterbrochen online und muesste somit auch die Zeit immer neu gesetzt haben. Ich habe extra rdate genutzt, da dem ntp deamon nicht ganz vertraut habe.
Nach diesem Test habe ich nun den Verdacht, das es am Skript selber liegt. Ist es moeglich das dieses die Timedrift verursacht? Waeren es nur ein paar milisekunden, ware das ja kein Problem, aber ueber 24 Stunden waren es etwas mehr als drei Sekunden.
Hier das Skript:
#!/usr/bin/python
import time
import serial
import datetime
from datetime import timedelta
import os.path
# open hourly/minute file and create headers
def createCeilFile():
save_path = "/home/pi/RAW/"
time_now4 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
if int(time_now4[14:16]) == 59 and int(time_now4[17:19]) >= 45:
Y = datetime.datetime.now().strftime('%Y')[3]
plusonehour = datetime.datetime.now() + timedelta(hours=1)
filedate = plusonehour.strftime('Z'+Y+'%m%d%H')
filename = os.path.join(save_path, filedate+".dat")
fid = open(filename, "w")
time_now = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')
fid.writelines(["-Ceilometer Logfile","\n","-File created: "+time_now,"\n"])
return fid
else:
Y = datetime.datetime.now().strftime('%Y')[3]
filedate = datetime.datetime.now().strftime('Z'+Y+'%m%d%H')
filename = os.path.join(save_path, filedate+".dat")
fid = open(filename, "w")
time_now = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')
fid.writelines(["-Ceilometer Logfile","\n","-File created: "+time_now,"\n"])
return fid
# open the first file at program start
fid = createCeilFile()
# serial port settings
ser=serial.Serial(
port='/dev/ttyUSB0',
baudrate = 2400,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS,
)
counter=0
# read first byte, grab date string, read rest of string, print both in file
while 1:
tdata = ser.read()
time_now2 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
time.sleep(3)
data_left = ser.inWaiting()
tdata += ser.read(data_left)
fid.writelines(["-"+time_now2,"\n",tdata,"\n"])
# should have ~10 secs before next message needs to come in
# if next string will go into the next hour
if int(time_now2[14:16]) == 59 and int(time_now2[17:19]) >= 45:
time_now3 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# close old file
fid.writelines(["File closed: "+time_now3,"\n"])
fid.close()
#open new file
fid = createCeilFile()
# then it goes back to 'tdata = ser.read()' and waits again.
Alles anzeigen
Koennte das Skript aus irgend einem Grund fuer diese Verschiebung sorgen?
Danke und viele Gruesse,
BallerNacken