Forum: Mikrocontroller und Digitale Elektronik MSP430F149 NMEA String mit UART1 empfangen und auswerten


von Rosalie (Gast)


Lesenswert?

Hallo,

ich möchte ein GPS Modul welches NMEA Protokoll ausgibt an einen 
MSP430F149 anschließen. Anschließend möchte ich einige Daten des NMEA 
Streams auswerten.

Was läuft:

- Initialisierung des UART
- Interruptroutine: TXBUF1 = RXBUF1; (Terminalprog sendet und empfängt
  einwandfrei)
- GPS Modul sendet (kann ich auf dem Terminal sehen)
- Rx vom uC ist auch am Tx vom GPS Modul !!!
- Mit den Pegeln ist auch alles klar: Von der Elektronik ist es kein
  Problem.

Was kann ich nicht:

- Den String
  (z.B. 
$GPRMC,191410,A,4735.5634,N,00739.3538,E,0.0,0.0,181102,0.4,E,A*19)
   empfangen und in einem String speichern um diesen "auseinandernehmen"
   zu können um an die einzelnen Infos zwischen den Kommas ',' zu 
kommen.
- Diese einzelnen Infos sollen dann jeweils in einzelnen Variablen
  gespeichert werden. Dann kann ich diese sehrschnell sortieren, 
ausgeben
  oder ähnliches
- Die Checksummenprüfung ( hier: *19 ) lasse ich erst mal weg


Ich programmiere mit dem ICC430 - aber das dürfte dafür nicht so eine 
große Rolle spielen.

Hat jemand einen Codeschnipsel die ich verwenden könnte. Eigentlich ist 
es nur einzelne Empfangene ASCII Zeichen in einen string schreiben und 
diesen bei den Kommas trennen.

Danke schon mal...
Rosalie

von Gast (Gast)


Lesenswert?

strtok()

von Rahul D. (rahul)


Lesenswert?

Es würde sich anbieten, den String schon beim Empfang auf die Variablen 
zu verteilen:
Das "$" setzt einen Zähler zurück, der bei jedem neu eintreffenden 
Zeichen um 1 erhöht wird.
Je nach Zählerstand wird die jeweilige Variable bearbeitet.
Als weitere Trennzeichen benutzt man natürlich die Kommata.

von Rosalie (Gast)


Lesenswert?

Danke Gast,

dass weiss ich schon. Ich hab erst mal das Problem die empfangenen Daten 
in einen String zu bekommen. Mir ist nicht ganz klar, wie ich die 
empfangenen Bytes in einen String bekomme.
Ich schreibe mal die Interruptfunktion hin, die ich bereits habe:


static char string1[8];
char i;
char j = 0;

....


#pragma interrupt_handler uart1_rx:UART1RX_VECTOR
void uart1_rx (void)
{
while ((IFG2 & UTXIFG1) == 0);
//TXBUF1 = RXBUF1;

string1[j++] = RXBUF1;
  if (j > sizeof string1-1)
  {
    i = 0;
    j = 0;
    TXBUF1 = string1[i++];
  }



}

Das funktionier eben nicht. Es werden nicht alle Zeichen wieder 
ausgegeben. Und selbst dann habe ich die erst in einem Array, oder ( 
string1[] ) ???

Vielleicht kann mir jemand sagen, wie ich aus empfangenen Daten an der 
UART1 einen String bekomme, den ich dann mit strtok() auseinandernehmen 
kann. Was ich möchte ich folgendes Ergebnis:

Inhalt Variable_1 = $GPRMC
Inhalt Variable_2 = 191410
Inhalt Variable_3 = A
Inhalt Variable_4 = 4735.5634
  .
  .
  .
  .

Ein bißchen C-Code würde mir wahrscheinlich am besten helfen.

Danke

von Rahul D. (rahul)


Lesenswert?

C arbeitet dabei eher mit Pointern.

Ich würde gar nicht erst den Weg über Strings gehen, sondern die Werte 
in Zahlen-Variablen ablegen.

Entsprechende Wandel-Routinen findet man hier im Forum.

von Wolfgang (Gast)


Lesenswert?

falls Interesse besteht, könnte ich mal mein Programmschnipsel suchen, 
mit welchem ich einzelne NMEA-Daten aus dem Datenstrom herausgefischt 
habe, um sie mit einem MSP430F1611 auf einer Smart Media Karte 
abzuspeichern

von Rosalie (Gast)


Lesenswert?

Hallo Wolfgang,


es besteht immer noch Interesse !

Ich bin zwar immer noch dran, habe aber noch nicht den
richtigen Durchbruch geschafft. Es will mir einfach nicht gelingen
einen Datensatz von      $ ... CR LF      in einen String, oder
wenigstens in ein array zu bekommen.

Vielen Dank schon mal

von reflection (Gast)


Lesenswert?

Denke wir haben ein ähnliches Problem, vielleicht können wir uns ja 
gegenseitig helfen

Beitrag "MSP430 GPS-Daten von UART0 Probleme"

Gruss reflection

von Wolfgang (Gast)


Lesenswert?

Hier ein Programmschnipsel.
Bitte nicht über meinen Programmierstil schimpfen! nur wundern

Es entstand unter Verwendung der hier im Forum aufgeworfenen Themen:
„MSP430 UART Zeichenkette ausfiltern „  +  „GPS Datenstrom filtern“
Es wäre sinnvoll, hier mal nachzulesen.

Mein Prinzip ist folgendes: alle ankommenden Zeichen werden in ein 1024 
bytes großes Feld [Tabelle_roh] geschrieben.
Wird die im Interrupt-Unterprogramm   __interrupt void usart0_rx (void) 
festgelegte Zeichenfolge erkannt, ist das Ende des Datensatzes $GPGGA 
erreicht und es werden die 147 davor liegenden Zeichen aus dem Feld 
[Tabelle_roh ] ausgelesen, um dann weiter verarbeitet zu werden. (auf 
SM-Karte speichern, ..)

Zur Anzeige von Geschwindigkeit, Koordinaten, Uhrzeit usw. werden die 
aus dem Internet herunterladbaren Programme „gps_diag.zip“ und 
„VisualGPSInstall.exe“ verwendet, welche die Datensätze auswerten.

Man kann auch ein Navigationsprogramm verwenden und dort die Datensätze 
abspielen. Dann hat man sogar eine Landkarte dazu.

Falls etwas Brauchbares dabei ist, wäre ein Kurzkommentar nicht 
schlecht.

Wolfgang

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Mist Anhang fehlte

von reflection (Gast)


Lesenswert?

Habe alles nach Anleitung gemacht. Habe ein Conrad CR4 Modul. Geht aber 
nicht, ich krieg immer nur alles 0en raus... send habe ich auch immer 
brav gedrückt. Kann es sein, das wenn er keine gültigen Daten hat, er 
auch keine über die serielle Schnittstelle sendet? Ich habe hier im 
Wohnzimmer keinen Empfang. Wenn ich das Teil an USB anhänge und mit 
HyperTerminal schaue, erhalte ich Daten, auch wenn sie nicht korrekt 
sind. Möchte halt USB und seriell nutzen. Hat jemand noch nen Tipp auf 
Lager?

Greets

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.