📄 test_gps.c
字号:
/****************************************************************************
【文 件 名 称】TEST_GPS.c
【功 能 描 述】FS2410XP教学平台实验程序
【程 序 版 本】3.0
【创建及创建日期】优龙公司/2005-XX-XX
【修改及修改日期】2005-5-23
****************************************************************************/
//头文件定义
#include "def.h"
#include "2410addr.h"
#include "config.h"
#include "board.h"
#include "GPS.h"
extern unsigned long int strtoul(const char * /*nptr*/,
char ** /*endptr*/, int /*base*/);
char GPS_DATA1[] = { "$GPRMC,014106.350,A,2232.9727,N,11355.2626,E,0.00,,060405,,,A*7A" } ;
extern char *strncpy(char * /*s1*/, const char * /*s2*/, unsigned int num /*n*/) ;
extern double atof(const char * /*nptr*/) ;
extern char *strcpy(char * /*s1*/, const char * /*s2*/);
//***************************************************************************
GPS_INFO Gps_Infor;
//***************************************************************************
typedef struct {
U32 d; //degree
U32 c; //cent
} Position_Info;
static Position_Info Latitude, Longitude;
/********************************************************************
Function name: Get_Comma_Position
Parameter : *str:字符串指针
Description : 得到指定序号的逗号位置
Return :
Argument :
Autor & date :
*********************************************************************/
int Get_Comma_Position( int num,char *str )
{
int 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;
}
/********************************************************************
Function name: Get_Double_Number
Parameter : *s:字符串指针
Description : 得到双精度数
Return :
Argument :
Autor & date :
*********************************************************************/
double Get_Double_Number( char *s )
{
char buf[128];
int i;
double rev;
i = Get_Comma_Position(1,s);
strncpy( buf, s, i ) ;
buf[i] = 0 ;
rev = atof(buf) ;
printf("s=%s ,buf= %s,val= %f\n",s,buf,rev);
return rev;
}
/********************************************************************
Function name: StrToUL
Parameter : *s:字符串指针 len:长度
Description :
Return :
Argument :
Autor & date :
*********************************************************************/
static U32 StrToUL(char *s, int len)
{
U32 ret;
int i;
ret = 0;
for(i=0; i<len; i++) {
if(!s[i])
return ret;
if(s[i]<'0'||s[i]>'9')
return -1;
ret *= 10;
ret += s[i]-'0';
}
return ret;
}
/********************************************************************
Function name: Get_Position
Parameter : *s:字符串指针 *p:存放位置信息数据结构 longi:
Description : 获得GPS的位置信息,主要是经度,纬度
Return : void
Argument :
Autor & date :
*********************************************************************/
static int Get_Position( char *s, Position_Info *p, int longi)
{
char buf[10];
memcpy(buf, s, 2+longi);
buf[2+longi] = 0;
p->d = StrToUL(buf, 2+longi);
memcpy(buf, s+2+longi, 2);
memcpy(buf+2, s+5+longi, 4);
buf[6+longi] = 0;
p->c = StrToUL(buf, 6);
return 0;
}
/********************************************************************
Function name: UTC_To_BTC
Parameter : *GPS:GPS信息参数
Description : 将获得GPS信息的世界时间转换为北京时间
Return : void
Argument :
Autor & date :
*********************************************************************/
void UTC_To_BTC(date_time *GPS)
{
//如果秒号先出,再出时间数据,则将时间数据+1秒
GPS_SEC++; //加一秒
if(GPS_SEC>59)
{
GPS_SEC=0;
GPS_MIN++;
if(GPS_MIN>59)
{
GPS_MIN=0;
GPS_HOUR++;
}
}
GPS_HOUR+=8; //小时加八
if(GPS_HOUR>23)
{
GPS_HOUR-=24;
GPS_DATE+=1;
if(GPS_MONTH==2 ||
GPS_MONTH==4 ||
GPS_MONTH==6 ||
GPS_MONTH==9 ||
GPS_MONTH==11 )
{
if(GPS_DATE>30)
{
GPS_DATE=1;
GPS_MONTH++;
}
}
else
{
if(GPS_DATE>31)
{
GPS_DATE=1;
GPS_MONTH++;
}
}
if(GPS_YEAR % 4 == 0 )
{
if(GPS_DATE > 29 && GPS_MONTH ==2)
{
GPS_DATE=1;
GPS_MONTH++;
}
}
else
{
if(GPS_DATE>28 &&GPS_MONTH ==2)
{
GPS_DATE=1;
GPS_MONTH++;
}
}
if(GPS_MONTH>12)
{
GPS_MONTH-=12;
GPS_YEAR++;
}
}
}
#define MAX_TRASH_NUM (12)
/********************************************************************
Function name: GPS_Parse
Parameter : *GPS: 要显示的GPS信息的数据结构
Description : 解析GPS发出的数据
Return : 返回1或0,1:有效,否则无效
Argument :
Autor & date :
*********************************************************************/
/****************************************************************************
【功能说明】解释gps发出的数据
$GPRMC,014105.350,A,2232.9727,N,11355.2626,E,0.00,,060405,,,A*79
$GPGGA,014105.350,2232.9727,N,11355.2626,E,1,06,1.2,57.7,M,,,,0000*31
$GPGSA,A,3,28,20,08,02,23,13,,,,,,,2.0,1.2,1.6*35
$GPGSV,3,2,09,20,30,048,30,02,16,252,36,13,08,131,34,08,08,186,26*7F
****************************************************************************/
U8 GPS_Parse( char *line, GPS_INFO *GPS )
{
static int tmp ;
if( GPS_BUF[5] == 'C' )//"GPRMC"
{
GPS_HOUR = ( GPS_BUF[7]-'0' )*10 + ( GPS_BUF[8]-'0' ) ;
GPS_MIN = ( GPS_BUF[9]-'0' )*10 + ( GPS_BUF[10]-'0' ) ;
GPS_SEC = ( GPS_BUF[11]-'0' )*10 + ( GPS_BUF[11]-'0' ) ;
//printf("sec=%d ", GPS_SEC);
//*********************************************************************
tmp = Get_Comma_Position( 9, GPS_BUF ) ; //第九个逗号后面是年月日信息
GPS_DATE = ( GPS_BUF[tmp+0]-'0' )*10 + ( GPS_BUF[tmp+1]-'0' ) ;
GPS_MONTH = ( GPS_BUF[tmp+2]-'0' )*10 + ( GPS_BUF[tmp+3]-'0' ) ;
GPS_YEAR = ( GPS_BUF[tmp+4]-'0' )*10 + ( GPS_BUF[tmp+5]-'0' ) + 2000 ;
//*********************************************************************
GPS_STATUS = GPS_BUF[Get_Comma_Position(2,GPS_BUF)]; //第二个逗号后是状态信息
//LATITUDE = Get_Double_Number( &GPS_BUF[Get_Comma_Position(3,GPS_BUF)] ); //第三个逗号后面是纬度信息
Get_Position(&GPS_BUF[Get_Comma_Position(3,GPS_BUF)], &Latitude, 0);
GPS_NS = GPS_BUF[ Get_Comma_Position(4,GPS_BUF) ]; //第四个逗号后面是北半球南半球指示信息
//LONGITUDE = Get_Double_Number( &GPS_BUF[Get_Comma_Position(5,GPS_BUF)] ); //第五个逗号后面是经度
Get_Position(&GPS_BUF[Get_Comma_Position(5,GPS_BUF)], &Longitude, 1);
GPS_EW = GPS_BUF[ Get_Comma_Position(6,GPS_BUF) ]; //第六个逗号后面是东半球西半球指示信息
#if ( USE_BEIJING_TIMEZONE )
UTC_To_BTC(&GPS->D);
#endif
//puts( "$GPRMC is OK!\n" ) ;
GPRMC = 1 ;
return 1 ;
}
else if ( GPS_BUF[5] == 'A' ) //"$GPGGA"
{
GPGGA = 1 ;
return 1 ;
}
return 0 ;
}
/********************************************************************
Function name: Show_GPS
Parameter : *GPS: 要显示的GPS信息的数据结构
Description : 显示获得GPS信息,这里主要是时间,日期,经度,纬度信息
Return : void
Argument :
Autor & date :
*********************************************************************/
void Show_GPS( GPS_INFO *GPS )
{
if( GPRMC == 1 )
{
if( GPS_STATUS == 'A' )
{
puts( "\nGPS DATA valid!\n" ) ;
printf("日期 : %4d-%02d-%02d \n", GPS_YEAR, GPS_MONTH, GPS_DATE ) ;
printf("时间 : %02d:%02d:%02d \n",GPS_HOUR, GPS_MIN, GPS_SEC ) ;
printf("纬度 : %d.%d %c\n", Latitude.d, Latitude.c, GPS_NS);
printf("经度 : %d.%d %c\n", Longitude.d, Longitude.c, GPS_EW);
}
else if( GPS_STATUS == 'V' )
{
puts( "GPS DATA invalid!!!\n" ) ;
printf("日期 : %4d-%02d-%02d \n", GPS_YEAR, GPS_MONTH, GPS_DATE ) ;
printf("时间 : %02d:%02d:%02d \n",GPS_HOUR, GPS_MIN, GPS_SEC ) ;
printf("纬度 : %d.%d %c\n", Latitude.d, Latitude.c, GPS_NS);
printf("经度 : %d.%d %c\n", Longitude.d, Longitude.c, GPS_EW);
}
GPRMC = 0; //clear flag
}
else if( GPGGA == 1 )
{
//printf("Highness : %.4f \n",GPS->high);
}
}
/********************************************************************
Function name: Uart_Initial
Parameter : uart:串口选择 baud:串口波特率
Description : 串口初始化,GPS将占用串口1
Return : void
Argument :
Autor & date :
*********************************************************************/
void Uart_Initial( U8 uart, U16 baud )
{
U32 mclk = GetMasterClock();
if( uart == 0 )
{
//UART0
rUFCON0 = 0x0; //FIFO disable
rUMCON0 = 0x0;
rULCON0 = 0x3; //Normal,No parity,1 stop,8 bit
rUCON0 = 0x245; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
rUBRDIV0 = ((int)(mclk/16./baud + 0.5) -1);
}
else if( uart == 1 )
{
//UART1
rUFCON1 = 0x0; //FIFO disable
rUMCON1 = 0x0;
rULCON1 = 0x3;
rUCON1 = 0x245;
rUBRDIV1 = ((int)(mclk/16./baud + 0.5) -1);
}
}
/********************************************************************
Function name: Receive_GPS
Parameter : void
Description : 接收GPS模块的信息输入
Return : 返回0或1,1:成功,否者无
Argument :
Autor & date :
*********************************************************************/
U8 Receive_GPS( void )
{
int i = 0 ;
char c ;
// U32 time_out = 500000 ;
while(getkey()!=ESC_KEY)//( time_out-- )
{
SerialSwitch( 1 ) ; //选择UART通道为串口1
// c = SerialRxChar(); //read from com port
c = SerialRxKey(); //read from com port
SerialSwitch( 0 ) ; //选择UART通道为串口0
if(c)
GPS_BUF[i++] = c ;
if( c == '\n' )
{
GPS_BUF[0]='$';
GPS_BUF[i]=0;
//puts( GPS_BUF ) ;
return 1 ;
}
}
return 0 ;
}
/********************************************************************
Function name: Test_GPS_Model
Parameter : void
Description : GPS实验函数
Return : void
Argument :
Autor & date :
*********************************************************************/
void Test_GPS_Model( void )
{
printf( "GPS全球定位系统\n" ) ;
Uart_Initial( 1, 4800 ) ; //串口1初始化,波特率为4800
while( getkey() != ESC_KEY )
{
if( Receive_GPS() ) //GPS接收函数
{
//strcpy( GPS_BUF, GPS_DATA1 ) ;
if ( GPS_Parse( GPS_BUF, &Gps_Infor ) ) ;//GPS解析函数
{
Show_GPS( &Gps_Infor ) ; //显示获得的GPS数据
}
}
else
break;
}
}
/*******************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -