⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_gps.c

📁 优龙电子ARM2410实验箱GPS---------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 + -