Dela upp NMEA-sträng med 'strtok'
-
- Inlägg: 67
- Blev medlem: 10 juli 2008, 15:47:06
- Ort: stockholm
- Kontakt:
Dela upp NMEA-sträng med 'strtok'
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..
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..
Re: Dela upp NMEA-sträng med 'strtok'
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).
Re: Dela upp NMEA-sträng med 'strtok'
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.
Annars är ju speakmans metod ett väldigt bra sätt att dela upp en sträng i flera mindre.
Re: Dela upp NMEA-sträng med 'strtok'
Drog ihop ett kompilerbart fulhack för att illustrera. Lite mer säkerhet kan ju vara att lägga på.
Output:
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;
}
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:~$
Re: Dela upp NMEA-sträng med 'strtok'
> 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.
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.
Re: Dela upp NMEA-sträng med 'strtok'
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.
Re: Dela upp NMEA-sträng med 'strtok'
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;
}
Kompileras till 162 bytes med Hi-Tech PICC och använder 603 klockcykler.
-
- Inlägg: 67
- Blev medlem: 10 juli 2008, 15:47:06
- Ort: stockholm
- Kontakt:
Re: Dela upp NMEA-sträng med 'strtok'
Tack för alla tips! Skall testa och återkommer med svar när jag fått till det.
Re: Dela upp NMEA-sträng med 'strtok'
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.
Har också en liten micro och har inte plats/lust o spara hela strängen då den tar halva ramet.