📄 gps.c
字号:
#include <w77e58.h>
#include "global.h"
#include "io.h"
#include "serial.h"
#include "timer.h"
#include "gps.h"
enum
{
LONLAT_DMM=1, /*LONGITUDE LATITUDE DEGREE MINUTE MINUTE/10000 format */
LONLAT_DMS, /*LONGITUDE LATITUDE DEGREE MINUTE SECOND format */
};
#define GPRMC_TIME 1
#define GPRMC_AV_STATUS 2
#define GPRMC_NS_STATUS 4
#define GPRMC_EW_STATUS 6
#define GPRMC_LONGITUDE 5
#define GPRMC_LATTUDE 3
#define GPRMC_SPEED 7
#define GPRMC_ANGLE 8
#define GPRMC_YMD 9
#ifdef DEBUG_GPS
code uchar * debug_gps ="$GPRMC,090058.01,A,2233.4264,N,11406.1970,E,000.0,000.0,041206,002.1,W,A*29";
#endif
bit GPSReady;
bit GPSav; //1 = A
bit GPSns; //1 = N
bit GPSew; //1 = E
uchar xdata JWDMode;
UINT32 xdata Speed;
UINT32 xdata LonDeg,LonMin1,LonMin2,LatDeg,LatMin1,LatMin2;
UINT32 xdata xYear,xMonth,xDay;
UINT32 xdata xHour,xMin,xSec;
enum
{
JWD_DU=0,
JWD_DMS,
JWD_DMM,
};
uchar xdata m_Buffer[100];
extern char xdata TP_UD[];
//void ParseGPRMC(uchar xdata* GprmcBuff);
//void ParseNMEA0183(uchar xdata* GpsBuff);
int Split(uchar* str,uchar dot)
{
int i;
uchar dot_count;
dot_count=0;
for(i=0;i<250;i++)
{
if(str[i]==',')
{
dot_count++;
}
if(str[i]=='\r'&&str[i+1]=='\n') break;
if(dot_count==dot) return i;
}
return 0;
}
void GPSModule_init(void)
{
GPS_EN = HIGH;
delay_ms(20);
GPS_RESET=HIGH;
delay_ms(20);
GPS_RESET=LOW;
delay_ms(100);
GPS_RESET=HIGH;
}
UINT32 GetGpsInfoDmm(UINT32 degree,UINT32 minute1,UINT32 minute2,UINT8 mode)
{
if(mode==LONLAT_DMM)
return degree*600000+minute1*10000+minute2;
else
return degree*600000+minute1*10000+minute2*10000/60;
}
extern char xdata cmd[]; // 命令串
void ParseGPRMC(uchar* GprmcBuff)
{
int i,j,k;
UINT32 xdata Longitude;
UINT32 xdata Latitude;
i=Split(GprmcBuff,GPRMC_TIME); /*GPRMC_TIME =1*/
if(i==0) return;
/* 检查时间数据,eg:204700,A,*/
if(GprmcBuff[i+10]==',') //16
{
if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
GprmcBuff[i+7]!='.'||
GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9')
return;
}
else
{
if( GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
GprmcBuff[i+7]!='.'||
GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9'||
GprmcBuff[i+10]<'0'||GprmcBuff[i+10]>'9')
return;
}
xHour=(GprmcBuff[i+1]-'0')*10+(GprmcBuff[i+2]-'0');
xMin =(GprmcBuff[i+3]-'0')*10+(GprmcBuff[i+4]-'0');
xSec =(GprmcBuff[i+5]-'0')*10+(GprmcBuff[i+6]-'0');
i=Split(GprmcBuff,GPRMC_AV_STATUS);
if(i==0) return;
if(GprmcBuff[i+1]!='A'&& GprmcBuff[i+1]!='V')return;
GPSav = ((GprmcBuff[i+1]=='A')? 1:0);
//if(GPSav=='V')return;
/* 检查经度数据,eg:11709.432,W,*/
i=Split(GprmcBuff,GPRMC_LONGITUDE);
if(i==0) return;
if( GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
GprmcBuff[i+6]!='.'||
GprmcBuff[i+7]<'0'||GprmcBuff[i+7]>'9'||
GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9'||
GprmcBuff[i+10]<'0'||GprmcBuff[i+10]>'9')
return;
LonDeg=(GprmcBuff[i+1]-'0')*100+
(GprmcBuff[i+2]-'0')*10+
GprmcBuff[i+3]-'0';
LonMin1=(GprmcBuff[i+4]-'0')*10+
GprmcBuff[i+5]-'0';
LonMin2=(GprmcBuff[i+7]-'0')*1000+
(GprmcBuff[i+8]-'0')*100+
(GprmcBuff[i+9]-'0')*10+
GprmcBuff[i+10]-'0';
/* 检查纬度数据,eg:3403.868,N,*/
i=Split(GprmcBuff,GPRMC_LATTUDE);
if(i==0) return;
if( GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
GprmcBuff[i+5]!='.'||
GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9'||
GprmcBuff[i+7]<'0'||GprmcBuff[i+7]>'9'||
GprmcBuff[i+8]<'0'||GprmcBuff[i+8]>'9'||
GprmcBuff[i+9]<'0'||GprmcBuff[i+9]>'9')
return;
LatDeg=(GprmcBuff[i+1]-'0')*10+
GprmcBuff[i+2]-'0';
LatMin1=(GprmcBuff[i+3]-'0')*10+
GprmcBuff[i+4]-'0';
LatMin2=(GprmcBuff[i+6]-'0')*1000+
(GprmcBuff[i+7]-'0')*100+
(GprmcBuff[i+8]-'0')*10+
GprmcBuff[i+9]-'0';
i=Split(GprmcBuff,GPRMC_YMD);
if(i==0) return;
if( GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9'||
GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9'||
GprmcBuff[i+6]<'0'||GprmcBuff[i+6]>'9')
return;
xYear =(GprmcBuff[i+5]-'0')*10+GprmcBuff[i+6]-'0';
xMonth=(GprmcBuff[i+3]-'0')*10+GprmcBuff[i+4]-'0';
xDay =(GprmcBuff[i+1]-'0')*10+GprmcBuff[i+2]-'0';
i=Split(GprmcBuff,GPRMC_SPEED);
if(i==0) return;
if(GprmcBuff[i+4]=='.')
{
if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9'||
GprmcBuff[i+4]!='.'||
GprmcBuff[i+5]<'0'||GprmcBuff[i+5]>'9')
return;
Speed = (GprmcBuff[i+1]-'0')*1000+(GprmcBuff[i+2]-'0')*100+(GprmcBuff[i+3]-'0')*10+(GprmcBuff[i+5]-'0'); /*ELARGE 10*/
}
else
if(GprmcBuff[i+3]=='.')
{
if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]<'0'||GprmcBuff[i+2]>'9'||
GprmcBuff[i+3]!='.'||
GprmcBuff[i+4]<'0'||GprmcBuff[i+4]>'9')
return;
Speed = (GprmcBuff[i+1]-'0')*100+(GprmcBuff[i+2]-'0')*10+(GprmcBuff[i+4]-'0'); /*ELARGE 10*/
}
else
if(GprmcBuff[i+2]=='.')
{
if(GprmcBuff[i+1]<'0'||GprmcBuff[i+1]>'9'||
GprmcBuff[i+2]!='.'||
GprmcBuff[i+3]<'0'||GprmcBuff[i+3]>'9')
return;
Speed = (GprmcBuff[i+1]-'0')*10+(GprmcBuff[i+3]-'0'); /*ELARGE 10*/
}
else
if(GprmcBuff[i+1]==',' && GprmcBuff[i+2] != '.' && GPSav==1)
{
Speed = 0;
}
else
return;
JWDMode=JWD_DU;
sprintf(TP_UD,"Lat:");
if(JWDMode==JWD_DU) //度,如114。573124度
{
i= LatDeg;
j= (LatMin1*10000+LatMin2)/60; //33.4264 ==> 33*10000=330000+4264=334264/60=5571
k= (LatMin1*10000+LatMin2-j*60); //(334264-5571X60)=4/60
k=k*100/6;
if(k>=100)
sprintf(cmd,"%d.%d%d",i,j,k);
else
{
sprintf(cmd,"%d.%d0%d",i,j,k);
}
}
else
if(JWDMode==JWD_DMS) //度分秒 如114。27'34"
{
i= LatDeg;
j= LatMin1; //MIN
k= LatMin2*60/10000; //SEC
sprintf(cmd,"%d %d'%d\"",i,j,k);
}
strcat(TP_UD, cmd);
strcat(TP_UD, "\r\n");
strcat(TP_UD, "Long:");
if(JWDMode==JWD_DU) //度,如114。573124度
{
i= LonDeg;
j= (LonMin1*10000+LonMin2)/60; //33.4264 ==> 33*10000=330000+4264=334264/60=5571
k= (LonMin1*10000+LonMin2-j*60); //(334264-5571X60)=4/60
k=k*100/6;
if(k>=100)
sprintf(cmd,"%d.%d%d",i,j,k);
else
{
sprintf(cmd,"%d.%d0%d",i,j,k);
}
}
else
if(JWDMode==JWD_DMS) //度分秒 如114。27'34"
{
i= LonDeg;
j= LonMin1; //MIN
k= LonMin2*60/10000; //SEC
sprintf(cmd,"%d %d'%d\"",i,j,k);
}
strcat(TP_UD, cmd);
strcat(TP_UD, "\r\n");
strcat(TP_UD, "Speed:");
i= (Speed/10);
j= Speed%10;
sprintf(cmd,"%d.%d",i,j);
strcat(TP_UD, cmd);
strcat(TP_UD, "\r\n");
sprintf(cmd,"%d-%d-%d",(int)xYear+2000,(int)xMonth,(int)xDay);
strcat(TP_UD, cmd);
strcat(TP_UD, "\r\n");
sprintf(cmd,"%d:%d:%d",(int)xHour+8,(int)xMin,(int)xSec);
strcat(TP_UD, cmd);
strcat(TP_UD, "\r\n");
GPSns = ((GprmcBuff[i+10]=='N')? 1:0);
GPSew = ((GprmcBuff[i+23]=='E')? 1:0);
GPSReady = TRUE;
}
void ParseNMEA0183(uchar* GpsBuff)
{
if(strncmp(GpsBuff, "$GPRMC",5)==0)
{
/*jiuwang data format:*/
/* $GPRMC,090058.01,A,2233.4264,N,11406.1970,E,000.0,000.0,041206,002.1,W,A*29*/
if(GpsBuff[6]==',')
{
ParseGPRMC(GpsBuff);
}
}
}
void ReadGPS(void)
{
int i;
uchar retry;
#ifdef DEBUG_GPS
ParseNMEA0183(debug_gps);
#else
//if(GPS_UART1_RDY==FALSE) return NULL;
retry=250;
i=0;
while(retry--)
{
if((m_Buffer[i]=getdp310())=='$') break;
}
if(retry!=0)
{
while(1)
{
m_Buffer[++i]=getbyte1();
if(m_Buffer[i-1]=='\r' && m_Buffer[i]=='\n') break;
else if(i>100)break;
}
}
if(m_Buffer[0]=='$')
{
ParseNMEA0183(m_Buffer);
//gsmSendMessage();
#ifdef DEBUG
for(i=0;i<100;i++)
{
if(m_Buffer[i-1]=='\r' && m_Buffer[i]=='\n')
{
m_Buffer[i+1]=0;
putstring(m_Buffer);
break;
}
}
#endif
m_Buffer[0]=NULL;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -