Parser unter Bascom? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 726301
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
|
Hi!
Ich hab ein mehr oder weniger kleines Problem:
Für meinen GPS-Tacho möchte ich mit einem AVR den $GPVTG-Datensatz zerpflücken.
Ich habe da auch schon etwas Parsermäßiges gefunden (http://www.grote.net/bascom/msg07933.html), allerdings geht es da um einen anderen Datensatz, $GPRMC, aus dem die Zeit herausgepflückt wird.
Wie bekomme ich das jetzt umgeschrieben?
Nur mit Mid o.ä. wird es ja nicht gehen, leere Zeichen werden nämlich weggelassen, wodurch die Datensatzlänge variiert.
An den Kommata könnte man sich orientieren...
Aber wie?
So ist der Datensatz aufgebaut:
$GPVTG,0.0,T,359.6,M,0.0,N,0.0,K*47
^ ^ ^ ^
| | | |
| | | Geschwindigkeit über Grund in km/h (K)
| | |
| | Geschwindigkeit über Grund in Knoten (N)
| |
| Kurs (magnetisch, M)
|
Kurs (wahr, T)
Mir geht es nur um die Geschwindigkeit in km/h.
_________________
[ Diese Nachricht wurde geändert von: ElektroNicki am 10 Nov 2010 20:40 ] |
|
BID = 726379
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Zitat :
|
An den Kommata könnte man sich orientieren...
|
Ja, das wäre die passende Lösung .
Eine andere Möglichkeit wäre auch, beim String hinten anzufangen, vorausgesetzt, die Position der Daten verändert sich nicht.
Da ich nicht weiß, wie man das mit BASIC umsetzen kann, oder ob man dort überhaupt so schön durch Strings iterieren kann wie in vernünftigen Sprachen, würde ich vorne beginnen und alle Zeichen durchrattern und mit dem ASCII-Wert für das Komma vergleichen. Bei positivem Vergleich dann einen Zähler inkrementieren. Hat dieser den passenden Wert (also 6), dann speicherst du den Anfang der Information (Offset vom Stringanfang) und suchst das nächste Komma, welches quasi das Ende der interessanten Information darstellt und speicherst ebenfalls diese Position.
Alternativ kannst du dir auch ein paar Bytes in einem String reservieren und die passenden Informationen dort hineinkopieren.
Umzusetzen wäre das wohl mit mid.
Offtopic :
|
Das ist ein Grund, warum ich C immer wieder schätzen lerne - es ist alles so simple!
So kann man das in C machen:
register uint8_t cc = 0;
while(*inp) if(*inp++ == ',') if(cc++ == 6) while(*inp && *inp!=',') *vel++ = *inp++;
Vorsicht: kein sauberer Stil, da da ja keine Sau durchsteigt
(vel: Ergebnis, inp: dein String vom GPS-Gerät)
Leider ist Zeigerarithmetik auf AVRs nicht so effizient umsetzbar.
|
_________________
[ Diese Nachricht wurde geändert von: DonComi am 11 Nov 2010 8:52 ] |
|
BID = 726421
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Eine andere Möglichkeit wäre auch, beim String hinten anzufangen |
Nicht so gut, weil dazu die ganze Zeile zwischengespeichert werden müsste, was bei etlichen µC mangels Speicher auf Schwierigkeiten stösst.
Die meisten µC sind aber schnell genug um die Zeichen, während sie einlaufen, zu verarbeiten, sodass man praktisch nur noch den Resultatspeicher (evtl. schon binär) und evtl. die Lage des Dezimalpunkts zu verwalten hat.
Zitat :
| Vorsicht: kein sauberer Stil, da da ja keine Sau durchsteigt |
Nicht nur das, sondern es ist auch höchst ungewiß und hängt vom Compiler ab, wie effizient der dazugehörige Maschinencode ist.
Wenn man das nachher von Hand optimieren muß, kann man genausogut gleich Assembler schreiben.
|
BID = 726434
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin,
@perl
Zitat :
|
Nicht so gut, weil dazu die ganze Zeile zwischengespeichert werden müsste, was bei etlichen µC mangels Speicher auf Schwierigkeiten stösst.
Die meisten µC sind aber schnell genug um die Zeichen, während sie einlaufen, zu verarbeiten, sodass man praktisch nur noch den Resultatspeicher (evtl. schon binär) und evtl. die Lage des Dezimalpunkts zu verwalten hat.
|
Nicht nur das, das Ende muss gesucht werden und das dauert ebenfalls, wobei ich nicht genau weiß, wie BASCOM Zeichenkettenobjekte verwaltet.
Bei vielen µCs ist RAM eine wertvolle Ressource, bei vielen AVRs allerdings weniger, daher auch der Vorschlag, mit Zeichenkettenoperationen zu arbeiten. Selbst bei den Kleineren sind z.B. 128B keine Seltenheit und damit kann man schon enorm viel anfangen.
Andere haben einen Hardwarestack mit einigen Registern für Calls, aber keinen "richtigen" RAM, also frei adressierbaren Speicher.
Zitat :
|
Nicht nur das, sondern es ist auch höchst ungewiß und hängt vom Compiler ab, wie effizient der dazugehörige Maschinencode ist.
Wenn man das nachher von Hand optimieren muß, kann man genausogut gleich Assembler schreiben.
|
So ist es.
Wie ich schrieb, sind AVRs nicht effizient nutzbar, wenn man ausgeklügelte Zeigerarithmetik umsetzen möchte. Das sieht später im synthetisierten Maschinenkode scheußlich aus und verbraucht unnötig Speicher (sowohl RAM als auch ROM).
Da wir nicht wissen, welchen µC Nicki nutzen möchte, ist alles andere Spekulation.
Ich würde z.B. dennoch obiges Konstrukt leicht verändert dazu benutzen, die paar Millisekunden und Instruktionen mehr tun meist nicht weh. Nur wenn alles in höchstem Maße begrenzt ist, strenge ich mich noch an, alles herauszuholen .
(Die Umsetzung in BASCOM wird wohl auch nicht sehr effizient sein...)
_________________
|
BID = 726438
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Es wird auf einen Atmega16 hinauslaufen, weil der gerade verfügbar ist.
Der hat iirc 512 Byte Ram, also genug.
Der Datensatz hat leider am Schluss noch ne Prüfsumme mit iirc variabler Länge, da kann man also auch nichts machen
Klar ist der Avr damit unterfordert, aber bevor er sich in der Schublade langweilt...
_________________
[ Diese Nachricht wurde geändert von: ElektroNicki am 11 Nov 2010 16:06 ]
|
BID = 726644
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 3 Beiträge verfasst © x sparkkelsputz Besucher : 182421509 Heute : 548 Gestern : 5459 Online : 297 29.11.2024 5:45 3 Besucher in den letzten 60 Sekunden alle 20.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0599679946899
|