//用C语言解析
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
void main()
{
char a[100] = "$GPGGA,061820.132,2844.3546,N,11551.8844,E,1,10,0.8,57.9,M,-5.6,M,,0000*6c<CR><LF>";// 举例
char* str[15];// 定义十五个指针数组,将所有的信息提取出来
int i = 0;// 循环变量,以指定各字符指针
char* flag;// 用于寻找桢头 $GPGGA,并进行判断
char* pold;// 用来放先前指针指向在字符串中某个特定位置
char* pnew;// 用来放后来指针指向的位置
int num = 0;// 两个字符如两个逗号之间的位置
flag = strstr(a, "$GPGGA");// 在 a 中寻找子串"$GPGGA",并记录位置
if (flag == NULL)// 若没有找到桢头 "$GPGGA",则出错
{
printf(" 出错了! \r\n");
}
for (i = 0, pold = flag; i < 13; i++)
{
pold = strstr(pold, ",");// 前面十三个数据都可以
pnew = strstr(pold + 1, ",");
num = pnew - pold - 1;
cout << num << endl;
str[i] = new char[num + 1];// 为 Time 多分配一个内存,以放最后的结束符
if (!str[i])// 判断内存分配是否成功
{
delete[]str[i];
}
memcpy(str[i], pold + 1, num);// 将 a 字符串的相关字符传给 Time
str[i][num] = '\0';// 在 Time 最后加上一个结束符
pold = pnew;
cout << str[i] << endl;
}
//i=13
pnew = strstr(a, "*");
num = pnew - pold - 1;
str[i] = new char[num + 1];// 为 Time 多分配一个内存,以放最后的结束符
if (!str[i])// 判断内存分配是否成功
{
delete[]str[i];
}
memcpy(str[i], pold + 1, num + 1);// 将 a 字符串的相关字符传给 Time
str[i][num] = '\0';// 在 Time 最后加上一个结束符
cout << str[i] << endl;
i += 1;
pold = pnew;// 在 a 中寻找子串 "$GPGGA",并记录位置
str[i] = new char[3];// 为 Time 多分配一个内存,以放最后的结束符
if (!str[i])// 判断内存分配是否成功
{
delete[]str[i];
}
memcpy(str[i], pold + 1, 2);// 将 a 字符串的相关字符传给 Time
str[i][2] = '\0';// 在 Time 最后加上一个结束符
cout << str[i] << endl;
int result = a[1];
for (i = 2; a[i] != '*'; i++)
{
result ^= a[i];
}
printf("result=%x\n", result);
}
// 此时调单步可以看到将每个数据都用一个字符指针获取了
GPGGA协议解析
最新推荐文章于 2023-04-04 22:55:26 发布