MSP430 UART Zeichenkette ausfiltern? Von einer GPS-maus werden die Daten über UART ständig zum µC übertragen. Wenn die Maus die Zeichenkette $GPRMC gesendet hat, soll ein Unterprogramm angesprungen werden, um die jetzt folgenden Daten weiter zu bearbeiten. Zur Zeit werden bei mir alle eingehenden Zeichen in einem [Feld] gespeichert und wenn 512 Bytes angekommen sind, auf eine Speicherkarte geschrieben. Hier ein von mir verwendeter Programmausschnitt: (geschrieben mit IAR für MSP430) #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { GPS = RXBUF0; // Register RXBUF0 wird gelesen, // Inhalt von RXBUF0 der Variablen // GPS zuordnen und RXBUF0 leeren zwischenspeichernGPS(); } void zwischenspeichernGPS(void) { Tabelle[t]=GPS; } Und so sieht der z. B. der Datenstrom aus: ,05,300,33*49 $GPGSV,3,3,08,,,,,,,,,15,43,069,4*,,,*4D $GPRMC,122905,A,5127.3760,N,01200.9286,E,0.00,323.02,080206,0.0,W*60 $GPGGA,122906,5127.3760,N,01200.9286,E,1,07,1.1,156.3,M,156.3,M,0.0,0000 *50 $GPGSA oder in Hexadezimaldarstellung: 00000140h: 35 2C 33 30 30 2C 33 33 2A 34 39 0D 0A 24 47 50 ; 5,300,33*49..$GP 00000150h: 47 53 56 2C 33 2C 33 2C 30 38 2C 2C 2C 2C 2C 2C ; GSV,3,3,08,,,,,, 00000160h: 2C 2C 2C 31 35 2C 34 33 2C 30 36 39 2C 34 2A 2C ; ,,,15,43,069,4*, 00000170h: 2C 2C 2A 34 44 0D 0A 24 47 50 52 4D 43 2C 31 32 ; ,,*4D..$GPRMC,12 00000180h: 32 39 30 35 2C 41 2C 35 31 32 37 2E 33 37 36 30 ; 2905,A,5127.3760 00000190h: 2C 4E 2C 30 31 32 30 30 2E 39 32 38 36 2C 45 2C ; ,N,01200.9286,E, 000001a0h: 30 2E 30 30 2C 33 32 33 2E 30 32 2C 30 38 30 32 ; 0.00,323.02,0802 000001b0h: 30 36 2C 30 2E 30 2C 57 2A 36 30 0D 0A 24 47 50 ; 06,0.0,W*60..$GP 000001c0h: 47 47 41 2C 31 32 32 39 30 36 2C 35 31 32 37 2E ; GGA,122906,5127. 000001d0h: 33 37 36 30 2C 4E 2C 30 31 32 30 30 2E 39 32 38 ; 3760,N,01200.928 000001e0h: 36 2C 45 2C 31 2C 30 37 2C 31 2E 31 2C 31 35 36 ; 6,E,1,07,1.1,156 000001f0h: 2E 33 2C 4D 2C 31 35 36 2E 33 2C 4D 2C 30 2E 30 ; .3,M,156.3,M,0.0 00000200h: 2C 30 30 30 30 2A 35 30 0D 0A 24 47 50 47 53 41 ; ,0000*50..$GPGSA Hat jemand einen Vorschlag, wie man den Anfang des Datensatzes $GPRMC, (in HEX 24 47 50 52 4D 43 2C ) programmtechnisch erkennen kann? MfG Wolfgang
In der ISR: if ((RXBUF0 == 0x24) && (count ==0))count++; if ((RXBUF0 == 0x47) && (count ==1))count++; if ((RXBUF0 == 0x50) && (count ==2))count++; if ((RXBUF0 == 0x52) && (count ==3))count++; if ((RXBUF0 == 0x4D) && (count ==4))count++; if ((RXBUF0 == 0x43) && (count ==5))count++; if ((RXBUF0 == 0x2C) && (count ==6))count++; if (count == 7) //Alle Buchstaben eingesammelt { count =0; unterprogramm(); } Beim Initialisieren des gesamten Programms musste natürlich count=0; machen, damit das auch beim ersten mal schon klappt. Ist zwar nich wirklich elegant, aber ich denke, das tuts.
Ah, Moment: hinter jedes if... in der ISR da muss noch nen else count =0; Sonst kommt der ja durchnander bei den anderen GP...
Du hast doch hier: http://www.mikrocontroller.net/forum/read-1-298120.html#new schon eine komplette Routine bekommen.
@SupaChris, danke für Deine Anregung. Mit einigen Änderungen, aber Beibehaltung des Prinzips, bin ich jetzt ein ganzes Stück weitergekommen. Wahrscheinlich geht es einfacher mit Zeiger, aber davon habe ich zu noch zu wenig Ahnung. Vielleicht hat noch jemand einen weiteren Tipp. MfG Wolfgang
in 'C': (hier bin ich nicht der SuperUser...)
1 | /******************************************************************************/
|
2 | extern void MsgHandler(unsigned char newchar) |
3 | /*******************************************************************************
|
4 | * ABSTRACT: Processes the characters coming in from USART. In this
|
5 | case,
|
6 | * this is the port connected to the gps receiver.
|
7 | *
|
8 | * INPUT: newchar Next character from the serial port.
|
9 | * OUTPUT: None
|
10 | * RETURN: None
|
11 | */
|
12 | {
|
13 | static unsigned char commas; // Number of commas for far in |
14 | sentence
|
15 | static unsigned char index; // Individual array index |
16 | |
17 | if (newchar == 0) // A NULL character resets GPS decoding |
18 | {
|
19 | commas = 25; // Set to an outrageous value |
20 | sentence_type = FALSE; // Clear local parse variable |
21 | return; |
22 | }
|
23 | |
24 | if (newchar == '$') // Start of Sentence character, reset |
25 | {
|
26 | commas = 0; // No commas detected in sentence for far |
27 | sentence_type = FALSE; // Clear local parse variable |
28 | return; |
29 | }
|
30 | |
31 | if (newchar == ',') // If there is a comma |
32 | {
|
33 | commas += 1; // Increment the comma count |
34 | index = 0; // And reset the field index |
35 | return; |
36 | }
|
37 | |
38 | if (commas == 0) |
39 | {
|
40 | switch(newchar) |
41 | {
|
42 | case ('C'): // Only the GPRMC sentence contains a "C" |
43 | sentence_type = GPRMC; // Set local parse variable |
44 | break; |
45 | case ('S'): // Take note if sentence contains an "S" |
46 | sentence_type = 'S'; // ...because we don't want to parse it |
47 | break; |
48 | case ('A'): // The GPGGA sentence ID contains "A" |
49 | if (sentence_type != 'S') // As does GPGSA, which we will ignore |
50 | sentence_type = GPGGA; // Set local parse variable |
51 | break; |
52 | }
|
53 | |
54 | return; |
55 | }
|
56 | |
57 | if (sentence_type == GPGGA) // GPGGA sentence decode initiated |
58 | {
|
59 | switch (commas) |
60 | {
|
61 | case (1): // Time field, grab characters |
62 | Time_Temp[index++] = newchar; |
63 | return; |
64 | case (2): // Latitude field, grab chars |
65 | Latitude_Temp[index++] = newchar; |
66 | return; |
67 | case (4): // Longitude field, grab chars |
68 | Longitude_Temp[index++] = newchar; |
69 | return; |
70 | case (7): // Satellite field, grab chars |
71 | Satellites_Temp[index++] = newchar; |
72 | return; |
73 | case (9): // Altitude field, grab chars |
74 | Altitude_Temp[index++] = newchar; |
75 | return; |
76 | }
|
77 | |
78 | return; |
79 | } // end if (sentence_type == GPGGA) |
80 | |
81 | if (sentence_type == GPRMC) // GPGGA sentence decode initiated |
82 | {
|
83 | switch (commas) |
84 | {
|
85 | case (7): // Speed field, grab characters |
86 | Speed_Temp[index++] = newchar; |
87 | return; |
88 | case (8): // Course field, grab characters |
89 | Course_Temp[index++] = newchar; |
90 | return; |
91 | }
|
92 | |
93 | return; |
94 | } // end if (sentence_type == GPRMC) |
95 | |
96 | return; |
97 | |
98 | } // End MsgHandler(unsigned char newchar) |
kann man auch nochmal hier bei N4TXI im Kontext nachlessen: http://www.knology.net/%7Egdion/whereavr.html 73 Axel DG1RTO (das hätte mal auch gut als attachment gepasst
Du kannst Deine GPS Maus allerdings auch so konfigurieren, das diese nur noch den RMC Strings sendet. Dann wartest Du aufs Dollar und zählst die einfliegenden Zeichen. Ist aber Murks...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.