MSP430 UART Zeichenkette ausfiltern?

Gast #301501
Lesenswert?

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
Gast #301502
Lesenswert?

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.
Gast #301506
Lesenswert?

@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
Gast #301507
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren