Parser unter Bascom?

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  05:45:19      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Parser unter Bascom?

    







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

Ich habe Google noch etwas gelöchert und schließlich tatsächlich gefunden, was ich suche.
Vielleicht funktioniert der Link sogar:
http://books.google.com/books?id=4K.....false

_________________


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


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