欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: gps解析程序 [打印本頁]

作者: yiwenyi    時間: 2017-4-17 10:38
標題: gps解析程序
gps解析程序

作者: yiwenyi    時間: 2017-4-17 10:39
/******************************************************************
         
******************************************************************/
#include "main.h"
#include "uart.h"

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


//定義變量


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

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

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


        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;        //獲取經度信息
                                                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延時函數
//****************************************************
void Delay_ms(unsigned int n)
{
        unsigned int  i,j;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}
作者: yiwenyi    時間: 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;     //允許串行口接收數據
        PCON = 0x00;  //SMOD=0;波特率不加倍
        TMOD = 0x20;  //T1方式2,用于產生波特率
        TH1  = 0xFD;  //裝初值
        TL1  = 0xFD;
        TR1  = 1;     //啟動定時器1
        EA   = 1;     //打開全局中斷控制
        ES   = 1;     //打開串行口中斷       
}

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

                };
                TI=0;
        }   
}

void UartPrintASCII(unsigned char c)                                //發送一個字符
{
    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"這一幀數據
        {
                gpsRxBuffer[RX_Count++] = temp;
                if(temp == '\n')                                                                          
                {
                        memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
                        memcpy(Save_Data.GPS_Buffer, gpsRxBuffer, RX_Count);         //保存數據
                        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);
       
}















作者: yiwenyi    時間: 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

//定義數組長度
#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數據
        char isParseData;        //是否解析完成
        char UTCTime[UTCTime_Length];                //UTC時間
        char latitude[latitude_Length];                //緯度
        char N_S[N_S_Length];                //N/S
        char longitude[longitude_Length];                //經度
        char E_W[E_W_Length];                //E/W
        char isUsefull;                //定位信息是否有效
} xdata _SaveData;



//函數或者變量聲明
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
作者: yiwenyi    時間: 2017-4-17 10:40
#ifndef __MAIN_H__
#define __MAIN_H__

#include <reg52.h>



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

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


#endif
作者: 富得勝公司    時間: 2017-4-24 10:43
北斗的解析程序可以用這個嗎?
作者: 老生    時間: 2017-4-28 20:32
雖然不太懂、直覺上就覺得不可以。
一臺設備同時受到gps、北斗信號,怎么輸出定位信息。
作者: 留言組    時間: 2019-7-23 18:59
我也在看這個程序 你看懂他了嗎?




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1