Dela upp NMEA-sträng med 'strtok'

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
christoferivarsson
Inlägg: 67
Blev medlem: 10 juli 2008, 15:47:06
Ort: stockholm
Kontakt:

Dela upp NMEA-sträng med 'strtok'

Inlägg av christoferivarsson »

Hej
Håller på med min flödesmätare och skriver nu en funktion för att läsa in hastigheten från en GPS enligt NMEA-protokollet.

Jag har lyckats med att isolera den strängen som jag är intresserad av och skall nu bryta ut hastigheten som är kommaseparerad och dyker upp efter 7 st kommatecken. Strängen i sin helhet ser ut såhär:

$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A

Det finns en bra funktion som heter strtok som kan användas för att bryta upp strängen till:

040302.663
A
3939.7
N
10506.6
W
0.27
358.86
osv...ni fattar.

Tyvärr verkar inte denna funktionen finnas i mitt stdio.h bibliotek i CC5X kompilatorn. Finns det nåt annat smart sätt att bryta upp en sträng eller måste jag byta kompilator. Vilken rekomenderas isåfall? Vill självfallet skriva om så lite kod som möjligt...Använder MPLAB med cc5x och PIC16F628. Spara mig kommentarer om att det är en gammal PIC osv..
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av speakman »

Gör en pekar-array och iterera igenom strängen och ersätt alla kommatecken med 0-tecken och sätt elementen i pekararrayen till var sin position efter 0-tecknen (+ första byten naturligtvis).
Nerre
Inlägg: 27188
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av Nerre »

Om han BARA ska ha ut hastigheten är det väl bara att börja med en loop som söker fram det sjunde kommatecknet och sen läser tecknen fram till nästa komma?

Annars är ju speakmans metod ett väldigt bra sätt att dela upp en sträng i flera mindre.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av speakman »

Drog ihop ett kompilerbart fulhack för att illustrera. Lite mer säkerhet kan ju vara att lägga på.

Kod: Markera allt

#include <stdio.h>
#include <string.h>

int split_string(char **fldarray, char *string, char token)
{
        int fldcount = 0, lasthit = 0;

        fldarray[fldcount++] = string;

        while (*string) {
                if (lasthit) {
                        fldarray[fldcount++] = string;
                        lasthit = 0;
                }

                if (*string == token) {
                        *string = '\0';
                        lasthit = 1;
                }

                string++;
        }

        return fldcount;
}

#define NMEA_STRING "$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A"

int main(void)
{
        char nmea[128], *field[16];
        int n, count;

        strcpy(nmea, NMEA_STRING);
        count = split_string(field, nmea, ',');

        for (n = 0; n < count; n++)
                printf("field[%02d] = '%s'\n", n, field[n]);

        return 0;
}
Output:

Kod: Markera allt

daniel@chieftec:~$ ./nmea_test 
field[00] = '$GPRMC'
field[01] = '040302.663'
field[02] = 'A'
field[03] = '3939.7'
field[04] = 'N'
field[05] = '10506.6'
field[06] = 'W'
field[07] = '0.27'
field[08] = '358.86'
field[09] = '200804'
field[10] = ''
field[11] = '*1A'
daniel@chieftec:~$ 
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av sodjan »

> Tyvärr verkar inte denna funktionen finnas i mitt stdio.h bibliotek i CC5X kompilatorn.

Det finnns nog helt naturliga anledningar till det.
På en så pass liten processor (2 Kword minne) vill man nog i alla fall
göra något mer kompakt än att köra sådana där biblioteksfunktioner.
Att läsa ut det du beskriver är ju ganska enkelt hur som helst.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av speakman »

Jag såg inte processorvalet inser jag nu, men det går att köra samma princip som koden ovan om än inte lika strukturerat. Iterera och sätt noll-tecken, men räkna varje komma och plocka ut enbart det du ska ha så blir det mer effektivt.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av bos »

christoferivarsson skrev:Finns det nåt annat smart sätt att bryta upp en sträng

Kod: Markera allt

char str[] = "$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A";
char buf[8];

void main() {
  unsigned char i;
  unsigned char commas = 0;
  char *p;

  p = str;
  while (commas != 7) {
    if (*p++ != ',')
      continue;
    commas++;
  }

  i = 0;
  do {
    buf[i++] = *p++;
  } while (*p != ',');
  buf[i] = 0;
}
Optimera efter behov.

Kompileras till 162 bytes med Hi-Tech PICC och använder 603 klockcykler.
christoferivarsson
Inlägg: 67
Blev medlem: 10 juli 2008, 15:47:06
Ort: stockholm
Kontakt:

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av christoferivarsson »

Tack för alla tips! Skall testa och återkommer med svar när jag fått till det.
Matte
Inlägg: 218
Blev medlem: 4 april 2007, 19:54:17
Ort: Stockholm

Re: Dela upp NMEA-sträng med 'strtok'

Inlägg av Matte »

Håller på med nått liknande men jag sparar aldrig hela strängen. alltså jag räknar antalet ; och nollar räknaren då en ny rad kommer. sen sparar jag bara data då antalet ;=0 i strängen "typ" och då ;=4(?) så sparar jag hastigheten.

Har också en liten micro och har inte plats/lust o spara hela strängen då den tar halva ramet.
Skriv svar