xiaohu1993 发表于 2014-5-13 09:19:49

大家进来看看这是用的什么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;
                }


}

xiaohu1993 发表于 2014-5-13 09:21:41

主程序是这样的:
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);
           //}
          
           }
          }
       // }
        //}
          
}

PIC16F54 发表于 2014-5-13 10:49:57

GPS的输出基本都是标准的,NEMA电文。不同的模块波特率可能不同。

xiaohu1993 发表于 2014-5-14 09:00:22

PIC16F54 发表于 2014-5-13 10:49
GPS的输出基本都是标准的,NEMA电文。不同的模块波特率可能不同。

哦,这样啊,那我试试

taojie 发表于 2014-8-24 06:56:44

标准的
GPS

labtech 发表于 2014-8-24 08:25:55

0183的标准
页: [1]
查看完整版本: 大家进来看看这是用的什么GPS