2回答

0收藏

【F030 Nucleo】6.北斗&GPS双模定位模块数据的解析

STMCU STMCU 3568 人阅读 | 2 人回复 | 2015-08-25

    手上的模块不能闲着,能连接的都连接上。
    一般的定位模块都是通过串口连接,输出NM0183格式的数据,只要在MCU中解析就可以了。
    这款北斗&GPS模块也不例外,只比普通的GPS模块多输出个BD开头的数据而已,格式都是一样的。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct GPS
{
char AV; //'A|V'
char DT[13]; //"150622181500"
float Lon; //"117.3185"
float Lat; //"39.0940\0"
char EWNS[3]; //"E|W & N|S"
float Speed; //"xxx.xx\0" *1.852
float Dir; //"xxx.x\0"
float High; //"\0"
unsigned char Star; //"0~F"
unsigned char ANT; //'0'正常;'1'短路;'2'开路
} gpsData;
float LonLat(char* ll, int len)
{
//printf("%s - %d", ll, len);
char* s;
memcpy(s, ll, len);
//printf("%s", s);
printf("%f", atof(s));
return atof(s);
}
float Speed(char* speed, int len)
{
char* s = memmove(s, speed, len);
return atof(s);
}
void RMC(char* data)
{
char* s = NULL;
int len = 0;
//Time
char* p = strstr(data, ",");
int i = p - data + 1;
gpsData.DT[6] = data; i++;
gpsData.DT[7] = data; i++;
gpsData.DT[8] = data; i++;
gpsData.DT[9] = data; i++;
gpsData.DT[10] = data; i++;
gpsData.DT[11] = data; i++;
//AV
p = strstr(data + i, ",");
i = p - data + 1;
gpsData.AV = data; i++;
//Lat
p = strstr(data + i, ",");
i = p++ - data + 1;
s = strstr(p + 1, ",");
len = s - p;
gpsData.Lat = LonLat(p, len);
printf("%f", gpsData.Lat);
//NS
p = strstr(data + i, ",");
i = p++ - data + 1;
gpsData.EWNS[1] = data; i++;
//Lon
p = strstr(data + i, ",");
i = p++ - data + 1;
s = strstr(p + 1, ",");
len = s - p;
gpsData.Lon = LonLat(p, len);
//EW
p = strstr(data + i, ",");
i = p++ - data + 1;
gpsData.EWNS[0] = data; i++;
//Speed
p = strstr(data + i, ",");
i = p++ - data + 1;
s = strstr(p + 1, ",");
len = s - p;
gpsData.Speed = Speed(p, len);
//Dir
p = strstr(data + i, ",");
i = p++ - data + 1;
s = strstr(p + 1, ",");
len = s - p;
gpsData.Dir = atof(s);
//Date
p = strstr(data + i, ",");
i = p++ - data + 1;
memmove(&gpsData.DT[4], data + i, 2); i += 2;
memmove(&gpsData.DT[2], data + i, 2); i += 2;
memmove(&gpsData.DT[0], data + i, 2); i += 2;
printf("%f", gpsData.Lon);
}
void GGA(char* data)
{
}
void GSA(char* data)
{
}
void GSV(char* data)
{
}
void TXT(char* data)
{
}
void TD3020C(char* data)
{
switch (data[1])
{
case 'G': //GNRMC; GNGGA; GPGSA; GPGSV; GNTXT;
switch (data[2])
{
case 'N': //GNRMC; GNGGA; GNTXT;
switch (data[4])
{
case 'M': //GNRMC
RMC(data);
break;
case 'G': //GNGGA
GGA(data);
break;
case 'S': //GPGSA
GSA(data);
break;
}
break;
case 'P': //GPGSA; GPGSV;
switch (data[5])
{
case 'A': //GPGSA
GSA(data);
break;
case 'V': //GPGSV
GSV(data);
break;
}
break;
}
break;
case 'B': //BDGSA; BDGSV;
switch (data[5])
{
case 'A': //BDGSA
GSA(data);
break;
case 'V': //BDGSV
GSV(data);
break;
}
break;
}
}
int main(void)
{
TD3020C(GPSData);
}

    解析的函数封装到一个文件里了,不过只需要调用一个TD3020C(GPSData);就够了。
    GPSData就是串口获取到的定位模块的数据,解析后的结果保存在struct GPS里。
    可以在程序的任何地方调用。

分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

franki

发表于 2015-8-25 18:21:25 | 只看该作者

不错 ,北斗 GPS 解析  !
板凳

tjcfeng

发表于 2015-8-26 07:15:42 | 只看该作者

franki 发表于 2015-8-25 18:21
不错 ,北斗 GPS 解析  !

谢谢         
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条