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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4873|回復: 7
打印 上一主題 下一主題
收起左側

gps解析程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:190341 發表于 2017-4-17 10:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
gps解析程序
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:190341 發表于 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++);
}
回復

使用道具 舉報

板凳
ID:190341 發表于 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);
       
}














回復

使用道具 舉報

地板
ID:190341 發表于 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
回復

使用道具 舉報

5#
ID:190341 發表于 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
回復

使用道具 舉報

6#
ID:192967 發表于 2017-4-24 10:43 | 只看該作者
北斗的解析程序可以用這個嗎?
回復

使用道具 舉報

7#
ID:194482 發表于 2017-4-28 20:32 | 只看該作者
雖然不太懂、直覺上就覺得不可以。
一臺設備同時受到gps、北斗信號,怎么輸出定位信息。
回復

使用道具 舉報

8#
ID:553238 發表于 2019-7-23 18:59 | 只看該作者
我也在看這個程序 你看懂他了嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品一区二区三区 | 亚洲高清av在线 | 81精品国产乱码久久久久久 | 日本不卡一区二区 | 91精品国产综合久久小仙女图片 | 国产乱码精品一品二品 | 国产精品久久久久久久久久久久久久 | 中文字幕日韩欧美一区二区三区 | 免费一级淫片aaa片毛片a级 | 欧美日高清视频 | 久久精品国产一区二区电影 | 午夜精品网站 | 国产免国产免费 | 中国黄色毛片视频 | 欧美一区二区精品 | 国产视频精品区 | 中文字幕日韩欧美一区二区三区 | 狠狠狠色丁香婷婷综合久久五月 | 在线观看中文字幕 | 日韩在线一区二区三区 | 免费的黄色片子 | 天堂一区二区三区 | 亚洲一区二区在线 | 精品真实国产乱文在线 | 日韩成人专区 | 啪视频在线 | h视频免费观看 | 日本 欧美 三级 高清 视频 | 在线观看亚洲专区 | 免费99视频 | 亚洲一区中文字幕在线观看 | 欧美在线观看一区 | 国产三级 | 成人激情视频网 | 二区中文字幕 | 日韩午夜场 | 成av在线 | 国产一区二区三区在线 | www国产精品| 99精品视频在线 | 久久国产美女视频 |