从GPS-C计算距离时获取奇怪的值

从GPS-C计算距离时获取奇怪的值,c,math,gps,type-conversion,C,Math,Gps,Type Conversion,我使用PIC微控制器中GPS的纬度和经度计算车辆行驶的总距离。这里我的GPS模块处于空闲状态(未移动),因此总距离应显示为“0”(零),是的,它显示为零。但有时它会显示奇怪的值“9223372036854775808.775808”,后来我的总距离变为零 这是我的密码 #include<stdio.h> #include<math.h> #include <string.h> #define COMMA 0x2C #define MAXSIZE 100

我使用PIC微控制器中GPS的纬度和经度计算车辆行驶的总距离。这里我的GPS模块处于空闲状态(未移动),因此总距离应显示为“0”(零),是的,它显示为零。但有时它会显示奇怪的值“9223372036854775808.775808”,后来我的总距离变为零

这是我的密码

    #include<stdio.h>
#include<math.h>
#include <string.h>
#define COMMA 0x2C
#define MAXSIZE 100
#define pi 3.14159265358979323846
double deg2rad(double);
double rad2deg(double);
float stof(char* s);
float Nmea_Degree(char *data);
double dist;
double distance(double lat1, double lon1, double lat2, double lon2, char unit);
float old_lat=0;
float old_lon=0;
float new_lat=0;
float new_lon=0;
int flag=0;
double theta, dist=0,old_dist=0;
int main()
{

    /* Get lattitude */
    int k=0,j=0;
    unsigned  char lastCommaPosition;
    unsigned char stringRead[MAXSIZE]="$GPRMC,124130.000,A,1300.4147,N,08015.4269,E,0.13,224.13,151015,,,D*6A";
    //$GPRMC,124130.000,A,1300.4147,N,08015.4269,E,0.13,224.13,151015,,,D*6A
    //$GPGGA,1300.80,4548.32609,N,01557.99352,E,1,07,1.30,129.1,M,41.4,M,,*5E
    unsigned char *pChar;
    unsigned char latitudeCardinalString[3];
    unsigned char latitudeString[11];
    unsigned char longitudeString[12];
    float longitude;
    float latitude;
    if(strstr(stringRead,"GPRMC")) //if(strstr(nmea,"GPRMC"))
    {
    pChar = stringRead;
    lastCommaPosition = j;
    j = lastCommaPosition + 1;
    while(*(pChar+j) != COMMA)
    {
    latitudeString[k] = *(pChar+j);
    j++;
    k++;
    }
    j=19;
    k=18;
    lastCommaPosition = j; 
    latitudeString[k] = '\0'; 
    sscanf(latitudeString, "%f", &latitude);
    pChar = stringRead;
    j = lastCommaPosition + 1;
    k = 0;
    while(*(pChar+j) != COMMA) {
    latitudeCardinalString[k] = *(pChar+j);
    j++;
    k++;
    }
    lastCommaPosition = j;
    latitudeCardinalString[k] = '\0';
    printf("Latitude(f):%f",Nmea_Degree(latitudeCardinalString)); ////Latitude
    printf("\n");

    new_lat=Nmea_Degree(latitudeCardinalString);
    /* Get Longitude */
    pChar = stringRead;
    j = lastCommaPosition + 1;
    k = 0;
    j=32;
    while(*(pChar+j) != COMMA) {
    longitudeString[k] = *(pChar+j);
    j++;
    k++;
    }

    lastCommaPosition = j;
    longitudeString[k] = '\0';
    sscanf(longitudeString, "%f", &longitude);
    printf("Longitude(f):%f",Nmea_Degree(longitudeString));  ////Longitude
    printf("\n");

    /*extract UTC time*/
        pChar=gpsdata;
        j = 1;  /* start of time field */
        k = 0;
        while(*(pChar+j) != COMMA)
        {
        timeString[k] = *(pChar+j);
        j++;
        k++;
        }
        lastCommaPosition = j;
        timeString[k] = '\0';
        sscanf(timeString, "%ld", &utcTime);
        utcHour = (utcTime/10000);   /* extract Hours from long */
        utcMinutes = (utcTime - (utcHour*10000))/100;  /* extract minutes from long */
        utcSeconds = utcTime - (utcHour*10000) - (utcMinutes*100); /* extract seconds from long */
        if(utcHour >= 4 && utcHour <= 23) estHour = utcHour + 5;
        else estHour = utcHour + 20;
        estMinutes = utcMinutes;
        estSeconds = utcSeconds;

    /*Total distance calculation*/  

    if(utcSeconds==15 || utcSeconds==30 || utcSeconds==45 || utcSeconds==00)
    {

    if(flag==0)
    {
        old_lat=Nmea_Degree(latitudeCardinalString);
        old_lon=Nmea_Degree(longitudeString);
        flag=1;
    }
    else
    {
        new_lat=Nmea_Degree(latitudeCardinalString);
        new_lon=Nmea_Degree(longitudeString);

        printf("%f",distance(old_lat,old_lon,new_lat,new_lon,'N'));
        old_lat=new_lat;
        old_lon=new_lon;
    }


    }
    else
    {

        printf("Bad GPS");
    }
    return 0;
}

float stof(char* s)
{
    int point_seen;
    float rez = 0, fact = 1;
    if (*s == '-')
    {
        s++;
        fact = -1;
    }
    for (point_seen = 0; *s; s++)
    {
        if (*s == '.')
        {
        point_seen = 1;
        continue;
        }
        int d = *s - '0';
        if (d >= 0 && d <= 9)
        {
        if (point_seen) fact /= 10.0f;
        rez = rez * 10.0f + (float)d;
        }
    }
    return rez * fact;
}

float Nmea_Degree(char *data)
{
    double  Value;
    int Degree;
    double  minute;
    Degree=stof(data)/100;
    minute=(float)stof(data)-(100*Degree);
    Value = Degree+(minute/60);
    return Value;
}

double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
  //double theta, dist;
  theta = lon1 - lon2;
  dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta));
  dist = acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  dist+=dist;
 return (dist);
}

double deg2rad(double deg) {
      return (deg * pi / 180);
    }

    double rad2deg(double rad) {
          return (rad * 180 / pi);
    }
这里我在stringRead变量中传递我的gps uart值。 有什么问题


谢谢…

首先,请修复代码的格式。这是不可读的。其次,GPS不是完美的,可能会有一些偏差和精度误差。但我预计,由于行驶距离数字的大小,您可能会出现软件错误。打开编译器警告并清除它们。注意,PIC没有提供
\uuuuu STDC\uu IEC\u 559\uuuu
。您似乎有严重错误:要么初始化错误,要么更糟。两个GPS坐标之间的最大距离不超过40.000 km(地球围栏)。计算到初始点(0.0,0.0)的距离是常见的错误。然而,你的情况更糟。这样的极值显示的是一个错误,不是由GPS引起的。只需打印出两个位置的纵横坐标即可计算距离。
    Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
interval:    02
old_lat:13.006952    old_lon:80.257065   new_lat:13.006949   new_lon:80.257065Total distance: 0.000000
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006949
Longitude:80.257065
Latitude:13.006948
Longitude:80.257065
Latitude:13.006948
Longitude:80.257065
Latitude:13.006948
Longitude:80.257065
Latitude:13.006948
Longitude:80.257065
Latitude:13.006948
Longitude:80.257065
Latitude:13.006948
Longitude:80.257065
old_lat:13.006949    old_lon:80.257065   new_lat:13.006948   new_lon:80.257065Total distance: 9223372036854775808.775808