大家进来看看这是用的什么GPS
我现在就只有程序,项目要求啊,所以大家帮我看看这是用的什么GPS。usart.c的程序是这样子的:
void USART1_IRQHandler(void)
{
char tmp;
tmp=USART1->DR;
switch(tmp){
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
break;
case '*':
switch(cmd_number){
case 1:
buf_full|=0x01;
if(cmd_number==1)ok=1;
else
ok=0;
break;
case 2:
buf_full|=0x02;
break;
case 3:
buf_full|=0x04;
break;
}
mode=0;
break;
default:
if(mode==1){
//命令种类判断
cmd=tmp; //接收字符放入类型缓存
if(byte_count>=4){ //如果类型数据接收完毕,判断类型
if(cmd=='G'){
if(cmd=='P'){
if(cmd=='G'){
if(cmd=='G'){
if(cmd=='A'){
cmd_number=1;
mode=2;
seg_count=0;
byte_count=0;
}
}
else if(cmd=='S'){
if(cmd=='V'){
cmd_number=2;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
else if(cmd=='R'){
if(cmd=='M'){
if(cmd=='C'){
cmd_number=3;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
}
}
}
}
else if(mode==2){
//接收数据处理
switch (cmd_number){
case 1: //类型1数据接收。GPGGA
switch(seg_count){
case 2:
//纬度处理
if(byte_count<11){
WD=tmp;
WD='\0'; //解决输出位数过多
}
break;
case 3:
//纬度方向处理
if(byte_count<1){
WD_a=tmp;
}
break;
case 4:
//经度处理
if(byte_count<11){
JD=tmp;
JD='\0';
}
break;
case 5:
//经度方向处理
if(byte_count<1){
JD_a=tmp;
}
break;
case 7:
//定位使用的卫星数
if(byte_count<2){
use_sat=tmp;
use_sat='\0';
}
break;
case 9:
//高度处理
if(byte_count<6){
high=tmp;
}
break;
}
break;
case 2: //类型2数据接收。GPGSV
switch(seg_count){
case 3:
//天空中的卫星总数
if(byte_count<2){
total_sat=tmp;
total_sat='\0';
}
break;
}
break;
case 3: //类型3数据接收。GPRMC
switch(seg_count){
case 1:
if(byte_count<10){
//时间处理
time=tmp;
}
break;
case 2:
//定位判断
if(byte_count<1){
lock=tmp;
}
break;
case 7:
//速度处理
if(byte_count<5){
speed2=tmp;
// spd_wei=byte_count;
}
break;
case 8:
//方位角处理
if(byte_count<5){
angle=tmp;
}
break;
}
break;
}
}
byte_count++; //接收数位加1
break;
}
} 主程序是这样的:
ouble d;
double f;
unsigned char d_d;
double D_D;
double F_F;
unsigned char p;
unsigned char time_8; //时区转换//
//GPS数据存储数组//
extern unsigned char JD; //经度
extern unsigned char JD_a; //经度方向
extern unsigned char WD; //纬度
extern unsigned char WD_a; //纬度方向
extern unsigned char time; //时间
extern unsigned char speed; //速度
extern unsigned char speed2; //速度
extern unsigned char high; //高度
extern unsigned char angle; //方位角
extern unsigned char use_sat; //使用的卫星数
extern unsigned char total_sat; //天空中总卫星数
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; //命令类型存储数组
extern unsigned char USART_END;
extern unsigned char ok;
//时区转换
void TIME_AREA(void){
time_8=(time-0x30)*10+(time-0x30)+8;
if(time_8>23)
{time_8=time_8-24 ;
}
time=(time_8/10)+0x30;
time=((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=(D_D/100);
p=((D_D-p*100)/10);
p=(((D_D-p*100-p*10))/1);
p='E'; //小数点
F_F=((D_D-p*100-p*10-p)*100000);
p=(F_F/10000);
p=((F_F-p*10000)/1000);
p=((F_F-p*10000-p*1000)/100);
p=((F_F-p*10000-p*1000-p*100)/10);
p=(((F_F-p*10000-p*1000-p*100-p*10))/1);
for(i=0;i<10;i++)
{p=p+0x30;
}
p=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);
//}
}
}
// }
//}
} GPS的输出基本都是标准的,NEMA电文。不同的模块波特率可能不同。 PIC16F54 发表于 2014-5-13 10:49
GPS的输出基本都是标准的,NEMA电文。不同的模块波特率可能不同。
哦,这样啊,那我试试 标准的
GPS 0183的标准
页:
[1]