📄 main.c
字号:
//******* 2006.07.26 完成参数分离及计算 ********//
#include "system.h"
uchar GPS_GPRMC_init[5] = "GPRMC";
uchar GPS_GPRMC_check[5];
uchar GPS_GPRMC_data[70];
uchar GPS_GPRMC_compare=0; //用于记录check和init对应字节相同的个数,若为5则是所需的数据
uchar GPS_PFST[10]="$PFST,NMEA";
uchar GPS_PFST_receive[40];
struct GPS_GPRMC myGPS_GPRMC_data;
struct GPS_GPRMC_Buffer myGPRMC_Buffer;
void main()
{
uchar data;
uchar i;
ushort gps_speed;
bool GPS_end=1;
unsigned short j=0;
unsigned char aa=0;
Init_PLL();
// Init_SDRAM();
Init_EBIU();
Init_UART();
// Init_Interrupts();
while(1)
{
if (*pUART_LSR & 0x0001)
{
data = *pUART_RBR;
if (data == 0x24) //若收到 $ ,则开始校验命令
{
GPS_GPRMC_compare = 0;
for( i=0 ; i<5 ; i++ )
{
while( !(*pUART_LSR & 0x0001) ) ;
GPS_GPRMC_check[i] = *pUART_RBR;
if( GPS_GPRMC_check[i] == GPS_GPRMC_init[i] ) GPS_GPRMC_compare++;
}
if( GPS_GPRMC_compare==5 ) //若命令匹配则读取数据
{
i=0;j=0;
GPS_end = 1;
do
{
while( !(*pUART_LSR & 0x0001) ) ;
data = *pUART_RBR;
if( data == 0x2c ) { j++; i=0;} //以逗号为标记,分离数据
else
{
switch (j)
{
case 1:myGPRMC_Buffer.time[i++] = data;break; //提取时间
case 3:myGPRMC_Buffer.Latitude[i++] = data;break; //提取纬度
case 5:myGPRMC_Buffer.Longitude[i++] = data;break;//提取经度
case 7:myGPRMC_Buffer.Speed[i++] = data;break; //提取速度
case 9:myGPRMC_Buffer.date[i++] = data;break; //提取日期
default: break;
}
}
if( data == 0xd ) GPS_end = 0;
}while( GPS_end );
i=0;
//计算时间
myGPS_GPRMC_data.hour = (myGPRMC_Buffer.time[i] -0x30)*10 + (myGPRMC_Buffer.time[i+1]-0x30);
myGPS_GPRMC_data.minute = (myGPRMC_Buffer.time[i+2]-0x30)*10 + (myGPRMC_Buffer.time[i+3]-0x30);
myGPS_GPRMC_data.second = (myGPRMC_Buffer.time[i+4]-0x30)*10 + (myGPRMC_Buffer.time[i+5]-0x30);
//计算日期
myGPS_GPRMC_data.day = (myGPRMC_Buffer.date[i] -0x30)*10 + (myGPRMC_Buffer.date[i+1]-0x30);
myGPS_GPRMC_data.month = (myGPRMC_Buffer.date[i+2]-0x30)*10 + (myGPRMC_Buffer.date[i+3]-0x30);
myGPS_GPRMC_data.year = (myGPRMC_Buffer.date[i+4]-0x30)*10 + (myGPRMC_Buffer.date[i+5]-0x30);
//计算纬度
myGPS_GPRMC_data.Lat = (myGPRMC_Buffer.Latitude[i] -0x30)*10 + (myGPRMC_Buffer.Latitude[i+1]-0x30);
myGPS_GPRMC_data.Lat_minute = (myGPRMC_Buffer.Latitude[i+2] -0x30)*10 + (myGPRMC_Buffer.Latitude[i+3]-0x30);
myGPS_GPRMC_data.Lat_dec = (myGPRMC_Buffer.Latitude[i+5] -0x30)*1000 + (myGPRMC_Buffer.Latitude[i+6]-0x30)*100 + (myGPRMC_Buffer.Latitude[i+7] -0x30)*10 + (myGPRMC_Buffer.Latitude[i+8]-0x30);
//计算经度
myGPS_GPRMC_data.Long = (myGPRMC_Buffer.Longitude[i] -0x30)*100 + (myGPRMC_Buffer.Longitude[i+1]-0x30)*10+(myGPRMC_Buffer.Longitude[i+2]-0x30);
myGPS_GPRMC_data.Long_minute= (myGPRMC_Buffer.Longitude[i+3] -0x30)*10 + (myGPRMC_Buffer.Longitude[i+4]-0x30);
myGPS_GPRMC_data.Long_dec = (myGPRMC_Buffer.Longitude[i+6] -0x30)*1000 + (myGPRMC_Buffer.Longitude[i+7]-0x30)*100 + (myGPRMC_Buffer.Longitude[i+8] -0x30)*10 + (myGPRMC_Buffer.Longitude[i+9]-0x30);
//计算速度
gps_speed = 0;
while( myGPRMC_Buffer.Speed[i] != 0x2e )
{
gps_speed = gps_speed*10 + (myGPRMC_Buffer.Speed[i++]-0x30);
}
myGPS_GPRMC_data.Speed_int = gps_speed;
myGPS_GPRMC_data.Speed_dec = (myGPRMC_Buffer.Speed[i+1] -0x30)*100 + (myGPRMC_Buffer.Speed[i+2]-0x30)*10 + (myGPRMC_Buffer.Speed[i+3]-0x30);
i=0;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -