微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神帮帮忙

大神帮帮忙

时间:10-02 整理:3721RD 点击:
//======================================================================
//=============================================================
//维护记录:2009-8-23 v1.0                by xgc
//          2010-1-30 v1.1    by xgc
//          增加函数:Get_Int_Number,Str_To_Int,GPS_GSV_Parse
//
//代码作者:  相广超  xgc94418297.blog.163.com
//=============================================================
#include "GPS.h"
#include <string.h>
#ifndef __GPS_H_#define __GPS_H_
#define uint  unsigned int
typedef struct{        int year;          int month;         int  day;        int hour;        int minute;        int second;}DATE_TIME;
typedef xdata struct{        double  latitude;  //经度        double  longitude; //纬度        int     latitude_Degree;        //度        int                latitude_Cent;                //分        int           latitude_Second;    //秒        int     longitude_Degree;        //度        int                longitude_Cent;                //分        int           longitude_Second;   //秒        float         speed;      //速度        float         direction;  //航向        float         height_ground;    //水平面高度        float         height_sea;       //海拔高度        int     satellite;        uchar         NS;        uchar         EW;        DATE_TIME D;}GPS_INFO;
//void GPS_Init(void);int GPS_RMC_Parse(char *line,GPS_INFO *GPS);int GPS_GGA_Parse(char *line,GPS_INFO *GPS);int GPS_GSV_Parse(char *line,GPS_INFO *GPS);
void Int_To_Str(int x,char *Str);
static uchar GetComma(uchar num,char* str);
static int Get_Int_Number(char *s);
static double Get_Double_Number(char *s);
static float Get_Float_Number(char *s);
static void UTC2BTC(DATE_TIME *GPS);
//====================================================================//
// 语法格式:int GPS_RMC_Parse(char *line, GPS_INFO *GPS)  
// 实现功能:把gps模块的GPRMC信息解析为可识别的数据
// 参    数:存放原始信息字符数组、存储可识别数据的结构体
// 返 回 值:
//                         1: 解析GPRMC完毕
//           0: 没有进行解析,或数据无效
//====================================================================//
int GPS_RMC_Parse(char *line,GPS_INFO *GPS)
{
        uchar ch, status, tmp;
        float lati_cent_tmp, lati_second_tmp;
        float long_cent_tmp, long_second_tmp;
        float speed_tmp;
        char *buf = line;
        ch = buf[5];
        status = buf[GetComma(2, buf)];
        if (ch == 'C')  //如果第五个字符是C,($GPRMC)
        {
                if (status == 'A')  //如果数据有效,则分析
                {
                        GPS -> NS       = buf[GetComma(4, buf)];
                        GPS -> EW       = buf[GetComma(6, buf)];
                        GPS->latitude   = Get_Double_Number(&buf[GetComma(3, buf)]);
                        GPS->longitude  = Get_Double_Number(&buf[GetComma( 5, buf)]);
               GPS->latitude_Degree  = (int)GPS->latitude / 100;       //分离纬度
                        lati_cent_tmp         = (GPS->latitude - GPS->latitude_Degree * 100);
                        GPS->latitude_Cent    = (int)lati_cent_tmp;
                        lati_second_tmp       = (lati_cent_tmp - GPS->latitude_Cent) * 60;
                        GPS->latitude_Second  = (int)lati_second_tmp;
                        GPS->longitude_Degree = (int)GPS->longitude / 100;        //分离经度
                        long_cent_tmp         = (GPS->longitude - GPS->longitude_Degree * 100);
                        GPS->longitude_Cent   = (int)long_cent_tmp;   
                        long_second_tmp       = (long_cent_tmp - GPS->longitude_Cent) * 60;
                        GPS->longitude_Second = (int)long_second_tmp;
                        speed_tmp      = Get_Float_Number(&buf[GetComma(7, buf)]);    //速度(单位:海里/时)
                        GPS->speed     = speed_tmp * 1.85;                           //1海里=1.85公里
                        GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度                       
                        GPS->D.hour    = (buf[7] - '0') * 10 + (buf[8] - '0');                //时间
                        GPS->D.minute  = (buf[9] - '0') * 10 + (buf[10] - '0');
                        GPS->D.second  = (buf[11] - '0') * 10 + (buf[12] - '0');
                        tmp = GetComma(9, buf);
                        GPS->D.day     = (buf[tmp + 0] - '0') * 10 + (buf[tmp + 1] - '0'); //日期
                        GPS->D.month   = (buf[tmp + 2] - '0') * 10 + (buf[tmp + 3] - '0');
                        GPS->D.year    = (buf[tmp + 4] - '0') * 10 + (buf[tmp + 5] - '0')+2000;
                        UTC2BTC(&GPS->D);
                       
                        return 1;
                }               
        }
       
        return 0;
}
//====================================================================//
// 语法格式:int GPS_GGA_Parse(char *line, GPS_INFO *GPS)  
// 实现功能:把gps模块的GPGGA信息解析为可识别的数据
// 参    数:存放原始信息字符数组、存储可识别数据的结构体
// 返 回 值:
//                         1: 解析GPGGA完毕
//           0: 没有进行解析,或数据无效
//====================================================================//
int GPS_GGA_Parse(char *line,GPS_INFO *GPS)
{
        uchar ch, status;
        char *buf = line;
        ch = buf[4];
        status = buf[GetComma(2, buf)];
        if (ch == 'G')  //$GPGGA
        {
                if (status != ',')
                {
                        GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]);
                        GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]);
                        return 1;
                }
        }
       
        return 0;
}
//====================================================================//
// 语法格式:int GPS_GSV_Parse(char *line, GPS_INFO *GPS)  
// 实现功能:把gps模块的GPGSV信息解析为可识别的数据
// 参    数:存放原始信息字符数组、存储可识别数据的结构体
// 返 回 值:
//                            1: 解析GPGGA完毕
//           0: 没有进行解析,或数据无效
//====================================================================//
int GPS_GSV_Parse(char *line,GPS_INFO *GPS)
{
        uchar ch, status;
        char *buf = line;
        ch = buf[5];
        status = buf[GetComma(2, buf)];
        if (ch == 'V')  //$GPGSV
        {
                GPS->satellite = Get_Int_Number(&buf[GetComma(3, buf)]);
                return 1;
        }
       
        return 0;
}
//====================================================================//
// 语法格式: static int Str_To_Int(char *buf)
// 实现功能: 把一个字符串转化成整数
// 参    数:字符串
// 返 回 值:转化后整数值
//====================================================================//
static int Str_To_Int(char *buf)
{
        int rev = 0;
        int dat;
        char *str = buf;
        while(*str != '\0')
        {
                switch(*str)
                {
                        case '0':
                                dat = 0;
                                break;
                        case '1':
                                dat = 1;
                                break;
                        case '2':
                                dat = 2;
                                break;               
                        case '3':
                                dat = 3;
                                break;
                        case '4':
                                dat = 4;
                                break;
                        case '5':
                                dat = 5;
                                break;
                        case '6':
                                dat = 6;
                                break;
                        case '7':
                                dat = 7;
                                break;
                        case '8':
                                dat = 8;
                                break;
                        case '9':
                                dat = 9;
                                break;
                }
                rev = rev * 10 + dat;
                str ++;
        }
        return rev;
}
//====================================================================//
// 语法格式: static int Get_Int_Number(char *s)
// 实现功能:把给定字符串第一个逗号之前的字符转化成整型
// 参    数:字符串
// 返 回 值:转化后整数值
//====================================================================//
static int Get_Int_Number(char *s)
{
        char buf[10];
        uchar i;
        int rev;
        i=GetComma(1, s);
        i = i - 1;
        strncpy(buf, s, i);
        buf[i] = 0;
        rev=Str_To_Int(buf);
        return rev;       
}
//====================================================================//
// 语法格式: static float Str_To_Float(char *buf)
// 实现功能: 把一个字符串转化成浮点数
// 参    数:字符串
// 返 回 值:转化后单精度值
//====================================================================//
static float Str_To_Float(char *buf)
{
        float rev = 0;
        float dat;
        int integer = 1;
        char *str = buf;
        int i;
        while(*str != '\0')
        {
                switch(*str)
                {
                        case '0':
                                dat = 0;
                                break;
                        case '1':
                                dat = 1;
                                break;
                        case '2':
                                dat = 2;
                                break;               
                        case '3':
                                dat = 3;
                                break;
                        case '4':
                                dat = 4;
                                break;
                        case '5':
                                dat = 5;
                                break;
                        case '6':
                                dat = 6;
                                break;
                        case '7':
                                dat = 7;
                                break;
                        case '8':
                                dat = 8;
                                break;
                        case '9':
                                dat = 9;
                                break;
                        case '.':
                                dat = '.';
                                break;
                }
                if(dat == '.')
                {
                        integer = 0;
                        i = 1;
                        str ++;
                        continue;
                }
                if( integer == 1 )
                {
                        rev = rev * 10 + dat;
                }
                else
                {
                        rev = rev + dat / (10 * i);
                        i = i * 10 ;
                }
                str ++;
        }
        return rev;
}
                                                                                               
//====================================================================//
// 语法格式: static float Get_Float_Number(char *s)
// 实现功能: 把给定字符串第一个逗号之前的字符转化成单精度型
// 参    数:字符串
// 返 回 值:转化后单精度值
//====================================================================//
static float Get_Float_Number(char *s)
{
        char buf[10];
        uchar i;
        float rev;
        i=GetComma(1, s);
        i = i - 1;
        strncpy(buf, s, i);
        buf[i] = 0;
        rev=Str_To_Float(buf);
        return rev;       
}
//====================================================================//
// 语法格式: static double Str_To_Double(char *buf)
// 实现功能: 把一个字符串转化成浮点数
// 参    数:字符串
// 返 回 值:转化后双精度值
//====================================================================//
static double Str_To_Double(char *buf)
{
        double rev = 0;
        double dat;
        int integer = 1;
        char *str = buf;
        int i;
        while(*str != '\0')
        {
                switch(*str)
                {
                        case '0':
                                dat = 0;
                                break;
                        case '1':
                                dat = 1;
                                break;
                        case '2':
                                dat = 2;
                                break;               
                        case '3':
                                dat = 3;
                                break;
                        case '4':
                                dat = 4;
                                break;
                        case '5':
                                dat = 5;
                                break;
                        case '6':
                                dat = 6;
                                break;
                        case '7':
                                dat = 7;
                                break;
                        case '8':
                                dat = 8;
                                break;
                        case '9':
                                dat = 9;
                                break;
                        case '.':
                                dat = '.';
                                break;
                }
                if(dat == '.')
                {
                        integer = 0;
                        i = 1;
                        str ++;
                        continue;
                }
                if( integer == 1 )
                {
                        rev = rev * 10 + dat;
                }
                else
                {
                        rev = rev + dat / (10 * i);
                        i = i * 10 ;
                }
                str ++;
        }
        return rev;
}
                                                                                               
//====================================================================//
// 语法格式: static double Get_Double_Number(char *s)
// 实现功能:把给定字符串第一个逗号之前的字符转化成双精度型
// 参    数:字符串
// 返 回 值:转化后双精度值
//====================================================================//
static double Get_Double_Number(char *s)
{
        char buf[10];
        uchar i;
        double rev;
        i=GetComma(1, s);
        i = i - 1;
        strncpy(buf, s, i);
        buf[i] = 0;
        rev=Str_To_Double(buf);
        return rev;       
}
//====================================================================//
// 语法格式:static uchar GetComma(uchar num,char *str)
// 实现功能:计算字符串中各个逗号的位置
// 参    数:查找的逗号是第几个的个数,需要查找的字符串
// 返 回 值:0
//====================================================================//
static uchar GetComma(uchar num,char *str)
{
        uchar i,j = 0;
        int len=strlen(str);
        for(i = 0;i < len;i ++)
        {
                if(str[i] == ',')
                        j++;
                if(j == num)
                        return i + 1;       
        }
        return 0;       
}
//====================================================================//
// 语法格式:void UTC2BTC(DATE_TIME *GPS)
// 实现功能:转化时间为北京时区的时间
// 参    数:存放时间的结构体
// 返 回 值:无
//====================================================================//
static void UTC2BTC(DATE_TIME *GPS)
{
        GPS->second ++;  
        if(GPS->second > 59)
        {
                GPS->second = 0;
                GPS->minute ++;
                if(GPS->minute > 59)
                {
                        GPS->minute = 0;
                        GPS->hour ++;
                }
        }       
    GPS->hour = GPS->hour + 8;
        if(GPS->hour > 23)
        {
                GPS->hour -= 24;
                GPS->day += 1;
                if(GPS->month == 2 ||
                                   GPS->month == 4 ||
                                   GPS->month == 6 ||
                                   GPS->month == 9 ||
                                   GPS->month == 11 )
                {
                        if(GPS->day > 30)
                        {
                                   GPS->day = 1;
                                GPS->month++;
                        }
                }
                else
                {
                        if(GPS->day > 31)
                        {       
                                   GPS->day = 1;
                                GPS->month ++;
                        }
                }
                if(GPS->year % 4 == 0 )
                {
                           if(GPS->day > 29 && GPS->month == 2)
                        {               
                                   GPS->day = 1;
                                GPS->month ++;
                        }
                }
                else
                {
                           if(GPS->day > 28 &&GPS->month == 2)
                        {
                                   GPS->day = 1;
                                GPS->month ++;
                        }
                }
                if(GPS->month > 12)
                {
                        GPS->month -= 12;
                        GPS->year ++;
                }               
        }
}
//====================================================================//
//        语法格式:        Int_To_Str(int x,char *Str)
//        实现功能:        转化整型值为字符串形式
//        参数:                x: 转化的整数
//                                Str:转化后的字符串
//        返回值:        无
//====================================================================//
void Int_To_Str(int x,char *Str)
{
        int t;
        char *Ptr,Buf[5];
        int i = 0;
        Ptr = Str;
        if(x < 10)                // 当整数小于10时,转化为"0x"的格式
        {
                *Ptr ++ = '0';
                *Ptr ++ = x+0x30;
        }
        else
        {
                while(x > 0)
                {
                        t = x % 10;
                        x = x / 10;
                        Buf[i++] = t+0x30;        // 通过计算把数字转化成ASCII码形式
                }
                i -- ;
                for(;i >= 0;i --)                 // 将得到的字符串倒序
                {
                        *(Ptr++) = Buf[i];
                }
        }
        *Ptr = '\0';
}


这个程序怎么编译不出来,帮忙看看,这个只要是GPS数据解析。小弟资历浅,各位高手显示下神威吧。





看错误提示。一步一步修改,就这样直接提问,一是基本没人会给你答案,二是,你永远都不会成长

嗯,自己改吧。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top