久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5003|回復: 7
收起左側

gps解析程序

[復制鏈接]
ID:190341 發(fā)表于 2017-4-17 10:38 | 顯示全部樓層 |閱讀模式
gps解析程序
回復

使用道具 舉報

ID:190341 發(fā)表于 2017-4-17 10:39 | 顯示全部樓層
/******************************************************************
         
******************************************************************/
#include "main.h"
#include "uart.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//定義變量


//****************************************************
//主函數(shù)
//****************************************************
void main()
{
        unsigned char i = 0;
        Uart_Init();
        Delay_ms(10);

        UartPrintf("Welcome to use!");
        UartPrintf("ILoveMCU.taobao.com");

        clrStruct();        //清空緩存數(shù)組


        while(1)
        {
                parseGpsBuffer();
                printGpsBuffer();
        }
}


void errorLog(int num)
{
       
        while (1)
        {
                  UartPrintf("ERROR");
                UartPrintASCII(num+0x30);
                UartPrintf("\r\n");
        }
}

void parseGpsBuffer()
{
        char *subString;
        char *subStringNext;
        char i = 0;
        if (Save_Data.isGetData)
        {
                Save_Data.isGetData = false;
                UartPrintf("**************\r\n");
                UartPrintf(Save_Data.GPS_Buffer);

               
                for (i = 0 ; i <= 6 ; i++)
                {
                        if (i == 0)
                        {
                                if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
                                        errorLog(1);        //解析錯誤
                        }
                        else
                        {
                                subString++;
                                if ((subStringNext = strstr(subString, ",")) != NULL)
                                {
                                        char usefullBuffer[2];
                                        switch(i)
                                        {
                                                case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //獲取UTC時間
                                                case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //獲取UTC時間
                                                case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //獲取緯度信息
                                                case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //獲取N/S
                                                case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;        //獲取經(jīng)度信息
                                                case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //獲取E/W

                                                default:break;
                                        }

                                        subString = subStringNext;
                                        Save_Data.isParseData = true;
                                        if(usefullBuffer[0] == 'A')
                                                Save_Data.isUsefull = true;
                                        else if(usefullBuffer[0] == 'V')
                                                Save_Data.isUsefull = false;

                                }
                                else
                                {
                                        errorLog(2);        //解析錯誤
                                }
                        }


                }
        }
}

void printGpsBuffer()
{
        if (Save_Data.isParseData)
        {
                Save_Data.isParseData = false;
               
                UartPrintf("Save_Data.UTCTime = ");
                UartPrintf(Save_Data.UTCTime);
                UartPrintf("\r\n");

                if(Save_Data.isUsefull)
                {
                        Save_Data.isUsefull = false;
                        UartPrintf("Save_Data.latitude = ");
                        UartPrintf(Save_Data.latitude);
                        UartPrintf("\r\n");


                        UartPrintf("Save_Data.N_S = ");
                        UartPrintf(Save_Data.N_S);
                        UartPrintf("\r\n");

                        UartPrintf("Save_Data.longitude = ");
                        UartPrintf(Save_Data.longitude);
                        UartPrintf("\r\n");

                        UartPrintf("Save_Data.E_W = ");
                        UartPrintf(Save_Data.E_W);
                        UartPrintf("\r\n");
                }
                else
                {
                        UartPrintf("GPS DATA is not usefull!\r\n");
                }
               
        }
}

//****************************************************
//MS延時函數(shù)
//****************************************************
void Delay_ms(unsigned int n)
{
        unsigned int  i,j;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}
回復

使用道具 舉報

ID:190341 發(fā)表于 2017-4-17 10:40 | 顯示全部樓層
******************************************************************/
#include "uart.h"

char idata gpsRxBuffer[gpsRxBufferLength];
unsigned char RX_Count = 0;
_SaveData Save_Data;

void Uart_Init()                                                                    
{
        SCON = 0X50;  //UART方式1;8位UART
        REN  = 1;     //允許串行口接收數(shù)據(jù)
        PCON = 0x00;  //SMOD=0;波特率不加倍
        TMOD = 0x20;  //T1方式2,用于產(chǎn)生波特率
        TH1  = 0xFD;  //裝初值
        TL1  = 0xFD;
        TR1  = 1;     //啟動定時器1
        EA   = 1;     //打開全局中斷控制
        ES   = 1;     //打開串行口中斷       
}

void UartPrintf(unsigned char *p)                                //發(fā)送字符串
{       
        while(*p)
        {
                 SBUF=*(p++);
                while(TI==0)
                {

                };
                TI=0;
        }   
}

void UartPrintASCII(unsigned char c)                                //發(fā)送一個字符
{
    TI=0;   
    SBUF=c;   
    while(TI==0);   
    TI=0;   
}


void RECEIVE_DATA(void) interrupt 4 using 3                         
{
        unsigned char temp = 0;
        char i = 0;
        ES=0;
        temp = SBUF;
        RI = 0;
       
        if(temp == '$')
        {
                RX_Count = 0;       
        }
               
        if(RX_Count <= 5)
        {
           gpsRxBuffer[RX_Count++] = temp;
        }
        else if(gpsRxBuffer[0] == '$' &gpsRxBuffer[4] == 'M' && gpsRxBuffer[5] == 'C')                        //確定是否收到"GPRMC/GNRMC"這一幀數(shù)據(jù)
        {
                gpsRxBuffer[RX_Count++] = temp;
                if(temp == '\n')                                                                          
                {
                        memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
                        memcpy(Save_Data.GPS_Buffer, gpsRxBuffer, RX_Count);         //保存數(shù)據(jù)
                        Save_Data.isGetData = true;
                        RX_Count = 0;
                        memset(gpsRxBuffer, 0, gpsRxBufferLength);      //清空                               
                }
               
                if(RX_Count >= 75)
                {
                        RX_Count = 75;
                        gpsRxBuffer[RX_Count] = '\0';//添加結束符
                }                       
        }
        ES=1;
}

void clrStruct()
{
        Save_Data.isGetData = false;
        Save_Data.isParseData = false;
        Save_Data.isUsefull = false;
        memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
        memset(Save_Data.UTCTime, 0, UTCTime_Length);
        memset(Save_Data.latitude, 0, latitude_Length);
        memset(Save_Data.N_S, 0, N_S_Length);
        memset(Save_Data.longitude, 0, longitude_Length);
        memset(Save_Data.E_W, 0, E_W_Length);
       
}














回復

使用道具 舉報

ID:190341 發(fā)表于 2017-4-17 10:40 | 顯示全部樓層
#ifndef __GPS_H__
#define __GPS_H__

#include <reg52.h>
#include "main.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define false 0
#define true 1

//定義數(shù)組長度
#define GPS_Buffer_Length 80
#define UTCTime_Length 11
#define latitude_Length 11
#define N_S_Length 2
#define longitude_Length 12
#define E_W_Length 2

typedef struct SaveData
{
        char GPS_Buffer[GPS_Buffer_Length];
        char isGetData;                //是否獲取到GPS數(shù)據(jù)
        char isParseData;        //是否解析完成
        char UTCTime[UTCTime_Length];                //UTC時間
        char latitude[latitude_Length];                //緯度
        char N_S[N_S_Length];                //N/S
        char longitude[longitude_Length];                //經(jīng)度
        char E_W[E_W_Length];                //E/W
        char isUsefull;                //定位信息是否有效
} xdata _SaveData;



//函數(shù)或者變量聲明
extern void Uart_Init();
extern void UartPrintf(unsigned char *p);
extern void UartPrintASCII(unsigned char c);
extern void clrStruct();


#define gpsRxBufferLength  76
extern char idata gpsRxBuffer[gpsRxBufferLength];
extern unsigned char RX_Count;
extern _SaveData Save_Data;


#endif
回復

使用道具 舉報

ID:190341 發(fā)表于 2017-4-17 10:40 | 顯示全部樓層
#ifndef __MAIN_H__
#define __MAIN_H__

#include <reg52.h>



//函數(shù)或者變量聲明
extern void Delay_ms(unsigned int n);

extern void printGpsBuffer();
extern void parseGpsBuffer();
extern void errorLog(int num);


#endif
回復

使用道具 舉報

ID:192967 發(fā)表于 2017-4-24 10:43 | 顯示全部樓層
北斗的解析程序可以用這個嗎?
回復

使用道具 舉報

ID:194482 發(fā)表于 2017-4-28 20:32 | 顯示全部樓層
雖然不太懂、直覺上就覺得不可以。
一臺設備同時受到gps、北斗信號,怎么輸出定位信息。
回復

使用道具 舉報

ID:553238 發(fā)表于 2019-7-23 18:59 | 顯示全部樓層
我也在看這個程序 你看懂他了嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频在线观看 | 大陆一级毛片免费视频观看 | 成人av电影免费在线观看 | 国产精品久久国产精品 | 久久成人激情 | 日韩精品一区二区三区 | 狠狠干网站 | 国产精品一区二区无线 | 国产粉嫩尤物极品99综合精品 | 日本一区二区三区免费观看 | 日韩不卡一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 国产视频中文字幕在线观看 | 欧美在线视频网站 | 亚洲欧洲中文日韩 | 久久九| 精品久久久久久久 | 在线观看视频91 | 日韩精品在线观看视频 | 久久久久久久久久爱 | 国产区久久 | 欧美日韩亚洲视频 | 亚洲欧美日韩电影 | 男人的天堂亚洲 | 欧美一区2区三区4区公司 | 久久久久久久久久久久91 | 观看av| 中文字幕在线一区二区三区 | 人人cao | 国产在线看片 | 国产在线一区二区 | 青青草综合 | 精品一区二区久久久久久久网站 | 日韩欧美中文字幕在线观看 | 9久9久9久女女女九九九一九 | 午夜精品一区二区三区在线视频 | 欧美高清一级片 | 欧美成人一区二免费视频软件 | 国产91久久久久久 | 91久久精品一区二区二区 | 亚洲欧美在线视频 |