搜索
bottom↓
回复: 5

大家进来看看这是用的什么GPS

[复制链接]

出0入0汤圆

发表于 2014-5-13 09:19:49 | 显示全部楼层 |阅读模式
我现在就只有程序,项目要求啊,所以大家帮我看看这是用的什么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[byte_count]=tmp;                        //接收字符放入类型缓存
                                        if(byte_count>=4){                                //如果类型数据接收完毕,判断类型
                                                if(cmd[0]=='G'){
                                                        if(cmd[1]=='P'){
                                                                if(cmd[2]=='G'){
                                                                        if(cmd[3]=='G'){
                                                                                if(cmd[4]=='A'){
                                                                                        cmd_number=1;
                                                                                        mode=2;
                                                                                        seg_count=0;
                                                                                        byte_count=0;
                                                                                }
                                                                        }
                                                                        else if(cmd[3]=='S'){
                                                                                if(cmd[4]=='V'){
                                                                                        cmd_number=2;
                                                                                        mode=2;
                                                                                        seg_count=0;
                                                                                        byte_count=0;
                                                                                }
                                                                        }
                                                                }
                                                                else if(cmd[2]=='R'){
                                                                        if(cmd[3]=='M'){
                                                                                if(cmd[4]=='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[byte_count]=tmp;
                                                                                WD[byte_count+1]='\0'; //解决输出位数过多
                                                                        }
                                                                        break;
                                                                case 3:                                                       

        //纬度方向处理
                                                                        if(byte_count<1){
                                                                                WD_a=tmp;
                                                                        }
                                                                        break;
                                                                case 4:                                                       

        //经度处理
                                                                        if(byte_count<11){
                                                                                JD[byte_count]=tmp;
                                                                                JD[byte_count+1]='\0';
                                                                        }
                                                                        break;
                                                                case 5:                                                       

        //经度方向处理
                                                                        if(byte_count<1){
                                                                                JD_a=tmp;
                                                                        }
                                                                        break;

                                                                case 7:                                                       

        //定位使用的卫星数
                                                                        if(byte_count<2){
                                                                                use_sat[byte_count]=tmp;
                                                                            use_sat[byte_count+1]='\0';
                                                                        }
                                                                        break;
                                                                case 9:                                                       

        //高度处理
                                                                        if(byte_count<6){
                                                                                high[byte_count]=tmp;
                                                                               
                                                                        }
                                                                        break;
                                                        }
                                                        break;
                                                case 2:                                //类型2数据接收。GPGSV
                                                        switch(seg_count){
                                                                case 3:                                                       

        //天空中的卫星总数
                                                                        if(byte_count<2){
                                                                                total_sat[byte_count]=tmp;
                                                                                total_sat[byte_count+1]='\0';
                                                                        }
                                                                        break;
                                                        }
                                               
                                                        break;
                                                case 3:                                //类型3数据接收。GPRMC
                                                        switch(seg_count){
                                                                case 1:
                                                                        if(byte_count<10){                               

//时间处理
                                                                                time[byte_count]=tmp;       
                                                                        }
                                                                        break;
                                                                case 2:                                                       

        //定位判断
                                                                        if(byte_count<1){
                                                                                lock=tmp;
                                                                        }
                                                                        break;
       
                                                                case 7:                                                       

        //速度处理
                                                                        if(byte_count<5){
                                                                               
                                        speed2[byte_count]=tmp;
                                                                        //        spd_wei=byte_count;
                                                                        }
                                                                        break;
                                                                case 8:                                                       

        //方位角处理
                                                                       
                                                       
                                                               
                                                                if(byte_count<5){
                                                                                angle[byte_count]=tmp;
                                                                        }
                                                                        break;
                                                        }
                                                        break;
                                        }
                                }
                                byte_count++;                //接收数位加1
                                break;
                }


}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 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);
           //}
          
           }
          }
         // }
        //  }
          
}

出0入0汤圆

发表于 2014-5-13 10:49:57 | 显示全部楼层
GPS的输出基本都是标准的,NEMA电文。不同的模块波特率可能不同。

出0入0汤圆

 楼主| 发表于 2014-5-14 09:00:22 | 显示全部楼层
PIC16F54 发表于 2014-5-13 10:49
GPS的输出基本都是标准的,NEMA电文。不同的模块波特率可能不同。

哦,这样啊,那我试试

出0入0汤圆

发表于 2014-8-24 06:56:44 | 显示全部楼层
标准的
GPS

出0入0汤圆

发表于 2014-8-24 08:25:55 来自手机 | 显示全部楼层
0183的标准
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 06:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表