GPS daten in TXT speichern.
lima-city → Forum → Programmiersprachen → Python
anzahl
ausgabe
breitengrad
code
datei
datensatz
datum
einlesen
empfangen
import
input
meeresspiegel
programm
protokoll
rang
satellit
string
uhrzeit
url
zeichen
-
Hallo LC,
ich habe dieses Programm um GPS Daten anzuzeigen:
import serial import sys import time Zeichen = 0 Laenge = 0 Qualitaet = 0 Satelliten = 0 Hoehe = 0.0 Breitengrad = 0.0 Laengengrad = 0.0 Input = "" Uhrzeit = "" Checksumme = "" Datenliste = [] # UART oeffnen UART = serial.Serial("/dev/ttyAMA0 ", 38400) UART.open() # Startmeldung print "" print "+---------------------------------------------------------------------+" print "| Dieses Programm empfaengt Daten einer Holux GPS-Maus, |" print "| die mittels GAA-Protokoll uebertragen wurden. |" print "| Der empfangene Datensatz wird zerlegt und in der Konsole angezeigt. |" print "+---------------------------------------------------------------------+" print "" while True: Zeichen = 0 # String leeren Input = "" # Zeichen empfangen Zeichen = UART.read() # Pruefen ob Uebertragung gestartet wurde if Zeichen == "$": # Zeichen 2-6 einlesen for Counter in range(4): Zeichen = 0 Zeichen = UART.read() Input = Input + str(Zeichen) # Pruefen ob das GGA Protokoll gesendet wird if Input == "GPGG": # Zeichen empfangen bis ein LF als Abschluss kommt while Zeichen != "\n": Zeichen = 0 Zeichen = UART.read() Input = Input + str(Zeichen) Input = Input.replace("\r\n", "") # Datensatz nach jedem "," trennen und in einer Liste speichern Datenliste = Input.split(",") # Laenge des Datensatzes feststellen Laenge = len(Input) # Uhrzeit herausfiltern Uhrzeit = Datenliste[1] Uhrzeit = Uhrzeit[0:2] + ":" + Uhrzeit[2:4] + ":" + Uhrzeit[4:6] # Laengen und Breitengrad herausfiltern und berechnen Breitengrad = float(Datenliste[2]) Breitengrad = Breitengrad / 100 Laengengrad = float(Datenliste[4]) Laengengrad = Laengengrad / 100 # Signalqualitaet herausfiltern Qualitaet = int(Datenliste[6]) # Anzahl der Satelliten herausfiltern Satelliten = int(Datenliste[7]) # Hoehe herausfiltern Hoehe = float(Datenliste[9]) # Checksumme auslesen Checksumme = Datenliste[14] # Ausgabe print Input print "" print "Laenge des Datensatzes:", Laenge, "Zeichen" print "Uhrzeit:", Uhrzeit print "Breitengrad:", Breitengrad, Datenliste[3] print "Laengengrad:", Laengengrad, Datenliste[5] print "Hoehe ueber dem Meeresspiegel:", Hoehe, Datenliste[10] print "GPS-Qualitaet:", Qualitaet print "Anzahl der Satelliten:", Satelliten print "Checksumme:", Checksumme print "-------------------------------------------"
Jetzt möchte ich das jeder 10ter Datensatz in eine TXT auf den Destop gespeichert wird.
Genauso wie er angezeigt wird. Also:
---------
Laenge des Datensatzes: xxx
Uhrzeit:xxx
Breitengrad:xxx
---------
nächster Datensatz
---------
usw.
Nochdazu hab ich das Problem das er hin&wieder bei der Auswertung Probleme hat. Ich denke mal wenn fehler bei der Übertragung des Datensatzes auftreten. Kann man das irgendwie per try verhindern?
mit Phython kenn ich mich leider noch nicht so gut aus.
LG
Christian -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo das ist doch relativ einfach umzusetzen. Du musst lediglich zu Beginn eine Datei zum schreiben öffnen, die Datensätze während sie ankommen mitzählen und bei Bedarf in die Datei schreiben.
Das Programm könnte dann ca. so aussehen:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122import
serial
import
sys
import
time
Zeichen
=
0
Laenge
=
0
Qualitaet
=
0
Satelliten
=
0
Hoehe
=
0.0
Breitengrad
=
0.0
Laengengrad
=
0.0
Input
=
""
Uhrzeit
=
""
Checksumme
=
""
Datenliste
=
[]
ExportDateiName
=
"C:/Users/christian1603/Desktop/output.txt"
# UART oeffnen
UART
=
serial.Serial(
"/dev/ttyAMA0 "
,
38400
)
UART.
open
()
# Startmeldung
print
""
print
"+---------------------------------------------------------------------+"
print
"| Dieses Programm empfaengt Daten einer Holux GPS-Maus, |"
print
"| die mittels GAA-Protokoll uebertragen wurden. |"
print
"| Der empfangene Datensatz wird zerlegt und in der Konsole angezeigt. |"
print
"+---------------------------------------------------------------------+"
print
""
ExportDatei
=
fopen(ExportDateiName,
"w"
)
Zaehler
=
0
while
True
:
Zeichen
=
0
# String leeren
Input
=
""
# Zeichen empfangen
Zeichen
=
UART.read()
# Pruefen ob Uebertragung gestartet wurde
if
Zeichen
=
=
"$"
:
# Zeichen 2-6 einlesen
for
Counter
in
range
(
4
):
Zeichen
=
0
Zeichen
=
UART.read()
Input
=
Input
+
str
(Zeichen)
# Pruefen ob das GGA Protokoll gesendet wird
if
Input
=
=
"GPGG"
:
# Zeichen empfangen bis ein LF als Abschluss kommt
while
Zeichen !
=
"\n"
:
Zeichen
=
0
Zeichen
=
UART.read()
Input
=
Input
+
str
(Zeichen)
# Datensatz komplett empfangen, Zähler erhöhen
Zaehler
+
=
1
Input
=
Input
.replace(
"\r\n"
, "")
# Datensatz nach jedem "," trennen und in einer Liste speichern
Datenliste
=
Input
.split(
","
)
# Laenge des Datensatzes feststellen
Laenge
=
len
(
Input
)
# Uhrzeit herausfiltern
Uhrzeit
=
Datenliste[
1
]
Uhrzeit
=
Uhrzeit[
0
:
2
]
+
":"
+
Uhrzeit[
2
:
4
]
+
":"
+
Uhrzeit[
4
:
6
]
# Laengen und Breitengrad herausfiltern und berechnen
Breitengrad
=
float
(Datenliste[
2
])
Breitengrad
=
Breitengrad
/
100
Laengengrad
=
float
(Datenliste[
4
])
Laengengrad
=
Laengengrad
/
100
# Signalqualitaet herausfiltern
Qualitaet
=
int
(Datenliste[
6
])
# Anzahl der Satelliten herausfiltern
Satelliten
=
int
(Datenliste[
7
])
# Hoehe herausfiltern
Hoehe
=
float
(Datenliste[
9
])
# Checksumme auslesen
Checksumme
=
Datenliste[
14
]
# Ausgabe
print
Input
Ausgabe
=
[]
Ausgabe.push("")
Ausgabe.push(
"Laenge des Datensatzes: "
+
Laenge
+
" Zeichen"
)
Ausgabe.push(
"Uhrzeit: "
+
Uhrzeit)
Ausgabe.push(
"Breitengrad: "
+
Breitengrad
+
" "
+
Datenliste[
3
])
Ausgabe.push(
"Laengengrad: "
+
Laengengrad
+
" "
+
Datenliste[
5
])
Ausgabe.push(
"Hoehe ueber dem Meeresspiegel: "
+
Hoehe
+
" "
+
Datenliste[
10
])
Ausgabe.push(
"GPS-Qualitaet: "
+
Qualitaet)
Ausgabe.push(
"Anzahl der Satelliten: "
+
Satelliten)
Ausgabe.push(
"Checksumme: "
+
Checksumme)
Ausgabe.push(
"-------------------------------------------"
)
# Immer auf dem Bildschirm ausgeben
print
'\n'
.join(Ausgabe)
# Jeden 10. Datensatz in Datei schreiben
if
Zaehler
%
10
:
ExportDatei.write(
'\n'
.join(Ausgabe))
ExportDatei.close()
Ist allerdings noch ungetestet. Dafür habe ich die Ausgabe etwas geändert, damit man nicht unnötig doppelt Code hat für die beiden unterschiedlichen Ausgaben. -
kochmarkus schrieb:
Hallo das ist doch relativ einfach umzusetzen. Du musst lediglich zu Beginn eine Datei zum schreiben öffnen, die Datensätze während sie ankommen mitzählen und bei Bedarf in die Datei schreiben.
Das Programm könnte dann ca. so aussehen:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122import
serial
import
sys
import
time
Zeichen
=
0
Laenge
=
0
Qualitaet
=
0
Satelliten
=
0
Hoehe
=
0.0
Breitengrad
=
0.0
Laengengrad
=
0.0
Input
=
""
Uhrzeit
=
""
Checksumme
=
""
Datenliste
=
[]
ExportDateiName
=
"C:/Users/christian1603/Desktop/output.txt"
# UART oeffnen
UART
=
serial.Serial(
"/dev/ttyAMA0 "
,
38400
)
UART.
open
()
# Startmeldung
print
""
print
"+---------------------------------------------------------------------+"
print
"| Dieses Programm empfaengt Daten einer Holux GPS-Maus, |"
print
"| die mittels GAA-Protokoll uebertragen wurden. |"
print
"| Der empfangene Datensatz wird zerlegt und in der Konsole angezeigt. |"
print
"+---------------------------------------------------------------------+"
print
""
ExportDatei
=
fopen(ExportDateiName,
"w"
)
Zaehler
=
0
while
True
:
Zeichen
=
0
# String leeren
Input
=
""
# Zeichen empfangen
Zeichen
=
UART.read()
# Pruefen ob Uebertragung gestartet wurde
if
Zeichen
=
=
"$"
:
# Zeichen 2-6 einlesen
for
Counter
in
range
(
4
):
Zeichen
=
0
Zeichen
=
UART.read()
Input
=
Input
+
str
(Zeichen)
# Pruefen ob das GGA Protokoll gesendet wird
if
Input
=
=
"GPGG"
:
# Zeichen empfangen bis ein LF als Abschluss kommt
while
Zeichen !
=
"\n"
:
Zeichen
=
0
Zeichen
=
UART.read()
Input
=
Input
+
str
(Zeichen)
# Datensatz komplett empfangen, Zähler erhöhen
Zaehler
+
=
1
Input
=
Input
.replace(
"\r\n"
, "")
# Datensatz nach jedem "," trennen und in einer Liste speichern
Datenliste
=
Input
.split(
","
)
# Laenge des Datensatzes feststellen
Laenge
=
len
(
Input
)
# Uhrzeit herausfiltern
Uhrzeit
=
Datenliste[
1
]
Uhrzeit
=
Uhrzeit[
0
:
2
]
+
":"
+
Uhrzeit[
2
:
4
]
+
":"
+
Uhrzeit[
4
:
6
]
# Laengen und Breitengrad herausfiltern und berechnen
Breitengrad
=
float
(Datenliste[
2
])
Breitengrad
=
Breitengrad
/
100
Laengengrad
=
float
(Datenliste[
4
])
Laengengrad
=
Laengengrad
/
100
# Signalqualitaet herausfiltern
Qualitaet
=
int
(Datenliste[
6
])
# Anzahl der Satelliten herausfiltern
Satelliten
=
int
(Datenliste[
7
])
# Hoehe herausfiltern
Hoehe
=
float
(Datenliste[
9
])
# Checksumme auslesen
Checksumme
=
Datenliste[
14
]
# Ausgabe
print
Input
Ausgabe
=
[]
Ausgabe.push("")
Ausgabe.push(
"Laenge des Datensatzes: "
+
Laenge
+
" Zeichen"
)
Ausgabe.push(
"Uhrzeit: "
+
Uhrzeit)
Ausgabe.push(
"Breitengrad: "
+
Breitengrad
+
" "
+
Datenliste[
3
])
Ausgabe.push(
"Laengengrad: "
+
Laengengrad
+
" "
+
Datenliste[
5
])
Ausgabe.push(
"Hoehe ueber dem Meeresspiegel: "
+
Hoehe
+
" "
+
Datenliste[
10
])
Ausgabe.push(
"GPS-Qualitaet: "
+
Qualitaet)
Ausgabe.push(
"Anzahl der Satelliten: "
+
Satelliten)
Ausgabe.push(
"Checksumme: "
+
Checksumme)
Ausgabe.push(
"-------------------------------------------"
)
# Immer auf dem Bildschirm ausgeben
print
'\n'
.join(Ausgabe)
# Jeden 10. Datensatz in Datei schreiben
if
Zaehler
%
10
:
ExportDatei.write(
'\n'
.join(Ausgabe))
ExportDatei.close()
Ist allerdings noch ungetestet. Dafür habe ich die Ausgabe etwas geändert, damit man nicht unnötig doppelt Code hat für die beiden unterschiedlichen Ausgaben.
Danke schonmal, weißt du zufällig das ich für die Funktion fopen Importieren muss?
ok denke es muss bei mir open heißen.
Beitrag zuletzt geändert: 26.6.2013 16:33:11 von christian1603 -
Ja,
open ist natürlich richtig. Mit fopen kam der alte C Programmierer in mir durch...
Schreib doch noch ein paar Details an welchen Stellen dein Programm mit welchen Fehlermeldungen abstürtzt. Dann kann man leichter rausfinden wie man den Fehler abfangen kann. -
kochmarkus schrieb:
Ja,
open ist natürlich richtig. Mit fopen kam der alte C Programmierer in mir durch...
Schreib doch noch ein paar Details an welchen Stellen dein Programm mit welchen Fehlermeldungen abstürtzt. Dann kann man leichter rausfinden wie man den Fehler abfangen kann.
import serial import sys import time import re Zeichen = 0 Laenge = 0 Qualitaet = 0 Satelliten = 0 Hoehe = 0.0 Breitengrad = 0.0 Laengengrad = 0.0 Input = "" Uhrzeit = "" Checksumme = "" Datenliste = [] # UART oeffnen UART = serial.Serial("/dev/ttyAMA0", 38400) UART.open # Startmeldung print "" print "+---------------------------------------------------------------------+" print "| Dieses Programm empfaengt Daten einer Holux GPS-Maus, |" print "| die mittels GAA-Protokoll uebertragen wurden. |" print "| Der empfangene Datensatz wird zerlegt und in der Konsole angezeigt. |" print "+---------------------------------------------------------------------+" print "" Zaehler = 0 while True: Zeichen = 0 # String leeren Input = "" # Zeichen empfangen Zeichen = UART.read() # Pruefen ob Uebertragung gestartet wurde if Zeichen == "$": # Zeichen 2-6 einlesen for Counter in range(4): Zeichen = 0 Zeichen = UART.read() Input = Input + str(Zeichen) # Pruefen ob das GGA Protokoll gesendet wird if Input == "GPGG": # Zeichen empfangen bis ein LF als Abschluss kommt while Zeichen != "\n": Zeichen = 0 Zeichen = UART.read() Input = Input + str(Zeichen) Input = Input.replace("\r\n", "") #zahler Zaehler +=1 # Datensatz nach jedem "," trennen und in einer Liste speichern Datenliste = Input.split(",") # Laenge des Datensatzes feststellen Laenge = len(Input) # Uhrzeit herausfiltern Uhrzeit = Datenliste[1] Uhrzeit = Uhrzeit[0:2] + ":" + Uhrzeit[2:4] + ":" + Uhrzeit[4:6] # Laengen und Breitengrad herausfiltern und berechnen Breitengrad = float(Datenliste[2]) Breitengrad = Breitengrad / 100 Laengengrad = float(Datenliste[4]) Laengengrad = Laengengrad / 100 # Signalqualitaet herausfiltern Qualitaet = int(Datenliste[6]) # Anzahl der Satelliten herausfiltern Satelliten = int(Datenliste[7]) # Hoehe herausfiltern Hoehe = float(Datenliste[9]) # Checksumme auslesen Checksumme = Datenliste[14] # Ausgabe print Input print "" print "Laenge des Datensatzes:", Laenge, "Zeichen" print "Uhrzeit:", Uhrzeit print "Breitengrad:", Breitengrad, Datenliste[3] print "Laengengrad:", Laengengrad, Datenliste[5] print "Hoehe ueber dem Meeresspiegel:", Hoehe, Datenliste[10] print "GPS-Qualitaet:", Qualitaet print "Anzahl der Satelliten:", Satelliten print "Checksumme:", Checksumme print "-------------------------------------------", Zaehler #Jeden 10. Datensatz in Datei schreiben if Zaehler == 10: ExportDatei = open("test.txt","a+") ExportDatei.write("".join(Input)) ExportDatei.write("\n") ExportDatei.close() Zaehler = 0
nach Start läuft er z.b 24 Sec dann kommt das:
ValueError: invalid literal for int() with base 10:'01142.9905'
Zeile: Qualitaet = Int(Datenliste[6])
Neustart:
nach 10 Sec:
ValueError: invalid literal for float() : 75$GPRMC
Hoehe = float(Datenbliste[9])
usw.
-
Hi, mal eine auf das wesentliche verkürzte Lösung nur um zeigen wie das Abfangen des Fehlers ca. aussehen kann:
12345678910111213while
True
:
Input
=
""
Zeichen
=
UART.read()
if
Zeichen
=
=
"$"
:
while
Zeichen !
=
"\n"
:
Zeichen
=
UART.read()
Input
+
=
str
(Zeichen)
try
:
Datenliste
=
Input
.split(
","
)
# Und der ganze restliche Code für einen Datensatz inkl. Ausgabe
except
ValueError:
# Irgendwas komisch mit dem Datensatz, also mit dem nächsten weitermachen
continue
Beitrag zuletzt geändert: 28.6.2013 13:47:02 von kochmarkus -
kochmarkus schrieb:
Hi, mal eine auf das wesentliche verkürzte Lösung nur um zeigen wie das Abfangen des Fehlers ca. aussehen kann:
12345678910111213while
True
:
Input
=
""
Zeichen
=
UART.read()
if
Zeichen
=
=
"$"
:
while
Zeichen !
=
"\n"
:
Zeichen
=
UART.read()
Input
+
=
str
(Zeichen)
try
:
Datenliste
=
Input
.split(
","
)
# Und der ganze restliche Code für einen Datensatz inkl. Ausgabe
except
ValueError:
# Irgendwas komisch mit dem Datensatz, also mit dem nächsten weitermachen
continue
ich habs jetzt so:
import serial import sys import time import re Zeichen = 0 Laenge = 0 Qualitaet = 0 Satelliten = 0 Hoehe = 0.0 Breitengrad = 0.0 Laengengrad = 0.0 Input = "" Uhrzeit = "" Checksumme = "" Datenliste = [] # UART oeffnen UART = serial.Serial("/dev/ttyAMA0", 38400) UART.open # Startmeldung print "" print "+---------------------------------------------------------------------+" print "| Dieses Programm empfaengt Daten einer Holux GPS-Maus, |" print "| die mittels GAA-Protokoll uebertragen wurden. |" print "| Der empfangene Datensatz wird zerlegt und in der Konsole angezeigt. |" print "+---------------------------------------------------------------------+" print "" Zaehler = 0 while True: Zeichen = 0 # String leeren Input = "" # Zeichen empfangen Zeichen = UART.read() # Pruefen ob Uebertragung gestartet wurde if Zeichen == "$": # Zeichen 2-6 einlesen for Counter in range(4): Zeichen = 0 Zeichen = UART.read() Input = Input + str(Zeichen) # Pruefen ob das GGA Protokoll gesendet wird if Input == "GPGG": # Zeichen empfangen bis ein LF als Abschluss kommt while Zeichen != "\n": Zeichen = 0 Zeichen = UART.read() Input = Input + str(Zeichen) try: Input = Input.replace("\r\n", "") #zahler Zaehler +=1 # Datensatz nach jedem "," trennen und in einer Liste speichern Datenliste = Input.split(",") # Laenge des Datensatzes feststellen Laenge = len(Input) # Uhrzeit herausfiltern Uhrzeit = Datenliste[1] Uhrzeit = Uhrzeit[0:2] + ":" + Uhrzeit[2:4] + ":" + Uhrzeit[4:6] # Laengen und Breitengrad herausfiltern und berechnen Breitengrad = float(Datenliste[2]) Breitengrad = Breitengrad / 100 Laengengrad = float(Datenliste[4]) Laengengrad = Laengengrad / 100 # Signalqualitaet herausfiltern Qualitaet = int(Datenliste[6]) # Anzahl der Satelliten herausfiltern Satelliten = int(Datenliste[7]) # Hoehe herausfiltern Hoehe = float(Datenliste[9]) # Checksumme auslesen Checksumme = Datenliste[14] # Ausgabe print Input print "" print "Laenge des Datensatzes:", Laenge, "Zeichen" print "Uhrzeit:", Uhrzeit print "Breitengrad:", Breitengrad, Datenliste[3] print "Laengengrad:", Laengengrad, Datenliste[5] print "Hoehe ueber dem Meeresspiegel:", Hoehe, Datenliste[10] print "GPS-Qualitaet:", Qualitaet print "Anzahl der Satelliten:", Satelliten print "Checksumme:", Checksumme print "-------------------------------------------", Zaehler #Jeden 10. Datensatz in Datei schreiben if Zaehler == 1: ExportDatei = open("test.txt","a+") ExportDatei.write("".join(Input)) ExportDatei.write("\n") ExportDatei.close() Zaehler = 0 except ValueError: continue
bekomme aber nun die Meldung "IndexError: list indes out od range"
Zeile: Uhrzeit = Datenliste[1]
hab ich was falsch gemacht? bzw Was ^^ -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage