|
楼主 |
发表于 2014-5-13 09:21:41
|
显示全部楼层
主程序是这样的:
ouble d;
double f;
unsigned char d_d;
double D_D;
double F_F;
unsigned char p[10];
unsigned char time_8; //时区转换//
//GPS数据存储数组//
extern unsigned char JD[11]; //经度
extern unsigned char JD_a; //经度方向
extern unsigned char WD[11]; //纬度
extern unsigned char WD_a; //纬度方向
extern unsigned char time[10]; //时间
extern unsigned char speed[6]; //速度
extern unsigned char speed2[6]; //速度
extern unsigned char high[6]; //高度
extern unsigned char angle[5]; //方位角
extern unsigned char use_sat[3]; //使用的卫星数
extern unsigned char total_sat[3]; //天空中总卫星数
extern unsigned char lock; //定位状态
//串口中断需要的变量
extern unsigned char seg_count; //逗号计数器
extern unsigned char dot_count; //小数点计数器
extern unsigned char byte_count; //位数计数器
extern unsigned char cmd_number; //命令类型
extern unsigned char mode; //0:结束模式,1:命令模式,2:数据模式
extern unsigned char buf_full; //1:整句接收完成,相应数据有效。0:缓存数据无效。
extern unsigned char cmd[5]; //命令类型存储数组
extern unsigned char USART_END;
extern unsigned char ok;
//时区转换
void TIME_AREA(void){
time_8=(time[0]-0x30)*10+(time[1]-0x30)+8;
if(time_8>23)
{time_8=time_8-24 ;
}
time[0]=(time_8/10)+0x30;
time[1]=((time_8-(time_8/10)*10)/1)+0x30;
}
//经纬度转换
double JWD_AREA(char* jwd){
d=atof(jwd)/100.0; //将JD[]转换为double
d_d=d/1;
f=(d-d_d)/60.0*100;
D_D=d_d+f;
return D_D;
}
//我没办法把double类型转换到uchar数组里。只好这么写了
void SUB_AREA(void)
{ p[0]=(D_D/100);
p[1]=((D_D-p[0]*100)/10);
p[2]=(((D_D-p[0]*100-p[1]*10))/1);
p[3]='E'; //小数点
F_F=((D_D-p[0]*100-p[1]*10-p[2])*100000);
p[4]=(F_F/10000);
p[5]=((F_F-p[4]*10000)/1000);
p[6]=((F_F-p[4]*10000-p[5]*1000)/100);
p[7]=((F_F-p[4]*10000-p[5]*1000-p[6]*100)/10);
p[8]=(((F_F-p[4]*10000-p[5]*1000-p[6]*100-p[7]*10))/1);
for(i=0;i<10;i++)
{p[i]=p[i]+0x30;
}
p[3]=0X2E; //小数点
}
main()
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,38400); //串口初始化为4800
LED_Init(); //初始化与LED连接的硬件接口
//KEY_Init();
//EXTIX_Init();
f_mount(0, &fs); // 初始化文件系统
f_open(&file, "gps_log.TXT", FA_OPEN_ALWAYS|FA_WRITE|FA_READ); //以读写方式打开不存在则建立
res=f_close(&file); //关闭文件
////////卡初始化ok///////
if(res==0)
{ for(i=0;i<10;i++)
{LED1=!LED1;
delay_ms(100);
}
LED0=1;
}
else
{while(1)
{LED0=!LED0;
delay_ms(100);
}
}
////主程序//////////
while(1)
{
// if(lock=='A')
// LED1=0;
// else
// LED1=1; //定位指示灯
//
// if(KEY0==1){
// delay_ms(10);
// if(KEY0==1){
if(lock=='A') //如果gps锁定
{
LED1=0; //锁定指示
while(ok==0); //如果gga语句未接收完,等待
TIME_AREA(); //时区转换
f_open(&file, "gps_log.TXT", FA_OPEN_ALWAYS|FA_WRITE|FA_READ ); //以读写方式打开不存在则建立
f_lseek(&file,file.fsize); //移动指针
f_printf(&file,"%d",r); //写序号
f_write(&file," ",1,&br); //写空格
f_write(&file,time,10,&br); //写time
f_write(&file," ",1,&br); //写空格
JWD_AREA(JD); //经度转换
SUB_AREA(); //转存
f_write(&file,p,9,&br); //写JD (d)
printf("%f\n",D_D);//串口输出调试jd
f_write(&file," ",1,&br); //写空格
JWD_AREA(WD); //纬度转换
SUB_AREA(); //转存
f_write(&file,p,9,&br); //写WD
printf("%f\n",D_D);//串口输出调试wd
f_write(&file," ",1,&br); //写空格
f_write(&file,high,5,&br); //写高度
f_write(&file," ",1,&br); //写空格
f_write(&file,angle,6,&br); //写航向
f_write(&file," ",1,&br); //写空格
f_write(&file,use_sat,3,&br); //写锁定卫星数量
f_printf(&file,"\n"); //换行
f_close(&file); //关闭文件
printf("%d\n",r); //串口输出排列序号
LED0=!LED0; //写卡指示灯
r++; //序号++
ok=0; //清除gga标志位
//for(i=0;i<30;i++)
//{
delay_ms(100);
//}
}
}
// }
// }
} |
|