wjr888 发表于 2013-6-5 09:31:31

请问UBLOX gps模块后五位与后四位不兼容怎么办?

大家对UBLOX gps模块语句输出后五位与其他品牌的模块的后四位在单片机程序不兼容怎么办?如何代换,或者将程序改成兼容两种模块的?

mandey 发表于 2013-6-5 09:56:19

不会吧,如果用只用GPRMC的话,肯定是通用的啊,不知道你说的后五位是什么意思。

skype 发表于 2013-6-5 17:37:22


<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)

是这吗?

wjr888 发表于 2013-6-5 20:03:55

mandey 发表于 2013-6-5 09:56 static/image/common/back.gif
不会吧,如果用只用GPRMC的话,肯定是通用的啊,不知道你说的后五位是什么意思。 ...

谢谢您的回复,我用UBLOXLEA-5代替c-470只有时间显示,具体是本坛这个东东http://www.amobbs.com/thread-4528057-2-1.html
原作者用得只用的GPRMC解析的时间日期等,轨迹记录估计用得是GPGGA语句,可能是由于是UBLOX模块采用的是语句小数点后五位,与c-470模块标准的小数点后五位用的程序不兼容所致(溢出),具体程序我不懂,麻烦帮忙看看修改哪一部分可行?
/*===================================================================
        void find_cama(void);               //寻找所有逗号位置
        unsigned char chr1num(unsigned char); //字符数字转十进制数
        unsigned char chr2num(unsigned char); //计算字符转十进制数
        void Analy_RMC(void);               //更新RMC相关数据
        void Analy_GGA(void);               //更新GGA相关数据
        void buf_clear(void);               //清空buf
数据输出
        void disp_frame(void);             //显示框架
        void data_updata(void);            //更新数据显示
        void disp_bat(unsigned char);      //电池信息
        void disp_sign(unsigned char);   //数据信号
        void disp_schetype(unsigned char); //0:等待,1:删除,2:上传,3:删除确认
        void disp_sche(unsigned int,unsigned int); //进度条
        void clear_sche(void);             //进度条块清空
        void disp_sata(void);            //显示运行状态
        void switch_sata(void);            //运行状态切换
        void disp_mode(void);            //模式显示
        void switch_mode(void);            //模式切换
        void disp_file(void);            //文件数显示
        void analy_datanum(void);          //获取数据数量
        void disp_record(unsigned char);   //记录提示符号 0:清除,1成功,2失败
        void onerecord(unsigned char);   //记录一组数据
        void formatrecord(void);         //格式化,删除所有数据
===================================================================*/
#include "iom8v.h"
#include "_LCD5110.h"
#include "_AT24C256.h"

#define R_GPS PORTC&=0xfb //GPS=0 PC2
#define S_GPS PORTC|=0x04 //GPS=1

#define KEY0(PINB&0x08) //(1<<PC3)
#define KEY1(PINB&0x10) //(1<<PC4)

#define DataNumMax 2520 //最大文件数 256*1024/8/13=2520.6

//缓冲区参数
unsigned char buf_gps={0}; //GPS数据缓冲区
unsigned char count_gps=0;   //GPS缓存地址
unsigned char id_sep={0};//逗号位置
//数据
unsigned char gps_hour=0;   //时
unsigned char gps_min=0;    //分
unsigned char gps_sec=0;    //秒
unsigned char gps_year=11;//年
unsigned char gps_mon=1;    //月
unsigned char gps_day=1;    //日
unsigned char gps_sata='V'; //'A'=1,'V'=0
unsigned char gps_lat={32,0,0,0,'N'};//纬度
unsigned char gps_lon={120,0,0,0,'E'}; //经度
unsigned intgps_speed=0;//速度0~540.4kmh
unsigned intgps_ang=360;//角度0~359
unsigned char gps_snum=0;   //卫星数目00~12
unsigned char gps_prec=100; //精度0.1~9.9
unsigned char gps_high={0}; //海拔(0位:有效位数)-999.9~9999.9m
//变量
unsigned intdata_num=0;   //已存储数据数
unsigned char var_bat=0;    //电池AD值
unsigned char var_ts=0;   //秒定时
unsigned char flg_sata=1;   //运行状态 1运行,0暂停

//寻找所有逗号位置---------------------------------------------
void find_cama(void)
{
        unsigned char cj,idj=0;                           //计数
        for(cj=0;cj<16;cj++) id_sep = 0;                //清零
        for(cj=0;cj<count_gps;cj++){                        //寻找逗号
                if(buf_gps==','){ id_sep = cj; idj++;} //标记逗号
        }
}

//字符数字转十进制数
unsigned char chr1num(unsigned char nid)
{
        return (buf_gps-48); //字符数字转真实数字
}
//计算字符转十进制数
unsigned char chr2num(unsigned char cid)
{
        return (chr1num(cid)*10+chr1num(cid+1)); //计算两位数字
}

/*更新RMC相关数据-------------------------------------------------------
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
$GPRMC,120225.000,A,3143.9615,N,12003.2206,E,0.00,,220810,,*1A
----------------------------------------------------------------------*/
void Analy_RMC(void)
{       
        unsigned char tp_h,tp_y,tp_m,tp_d,tp_p;
        unsigned int tp_va;
//时间,信息起点6 UTC->BJ
        tp_h = chr2num(id_sep+1)+8;//UTC->BJ
        gps_hour = tp_h%24;             //时
        gps_min = chr2num(id_sep+3); //分
        gps_sec = chr2num(id_sep+5); //秒
//日期, 信息起点var_camma+1
        tp_d = chr2num(id_sep+1);    //日
        tp_m = chr2num(id_sep+3);    //月
        tp_y = chr2num(id_sep+5);    //年
        if(tp_h>23){ //判断日期是否进位
                switch(tp_m){
                        case 4: case 6: case 9: case 11: tp_p = 30; break;
                        case 2: if(tp_y%4==0) tp_p = 29;
                                        else tp_p = 28;
                                        break;
                        default: tp_p = 31; break;
                }//判断当前月的天数
                if(tp_d<tp_p) tp_d++;
                else{
                        tp_d = 1;
                        if(tp_m<12) tp_m++;
                        else{ tp_m = 1; tp_y++;}
                }//天数增一
        }
        gps_year = tp_y; gps_mon = tp_m; gps_day = tp_d;
//GPS是否定位,信息起点17
        gps_sata = buf_gps+1]; //A定位,V未定位
//GPS纬度信息,信息起点var_camma+1=19sample:28'12.3456'
        tp_p = id_sep-id_sep;
        if(tp_p==10){
                gps_lat = chr2num(id_sep+1); //纬度.度
                gps_lat = chr2num(id_sep-7); //纬度.分.整数
                gps_lat = chr2num(id_sep-4); //纬度.分.小数
                gps_lat = chr2num(id_sep-2);
        }
        tp_p = id_sep-id_sep; //N/S, 信息起点id_sep+1       
        if(tp_p==2) gps_lat = buf_gps+1];
//GPS经度信息,信息起点var_camma+1sample:128'12.3456'
        tp_p = id_sep-id_sep;
        if(tp_p==11||tp_p==10){
                tp_y = chr2num(id_sep+1);
                if(tp_p==11) tp_y = tp_y*10+chr1num(id_sep+3); //三位
                gps_lon = tp_y;               //经度.度
                gps_lon = chr2num(id_sep-7); //经度.分.整数
                gps_lon = chr2num(id_sep-4); //经度.分.小数
                gps_lon = chr2num(id_sep-2);
        }       
        tp_p = id_sep-id_sep; //E/W,信息起点var_camma+1
        if(tp_p==2) gps_lon = buf_gps+1];
//速度 ,信息起点var_camma+1 海里->公里 sample:245.3kmh
        tp_p = id_sep-id_sep; tp_va = 0;
        if(tp_p>4){
                if(tp_p==7) tp_d = 6; //循环计算位数
                else tp_d = tp_p;
                for(tp_m=1;tp_m<tp_d;tp_m++){
                        if(tp_m==3) tp_m++;
                        tp_va = tp_va+chr1num(id_sep-tp_m)*185;
                        if(tp_m<5){
                                if((tp_va%10)>4) tp_va = tp_va/10+1;
                                else tp_va/=10;
                        }
                }//0.00-00.00 *185 海里*1.85*10 保留小数点后一位
                if(tp_p==7) tp_va = tp_va+chr1num(id_sep+1)*1850;
        }
        gps_speed = tp_va;
//航向, 可以不显示 信息起点var_seg+1
        tp_p = id_sep-id_sep;
        if(tp_p>4){
                tp_va=0; tp_p-=4;               //计算航向数据整数部长度
                for(tp_m=0;tp_m<tp_p;tp_m++)
                        tp_va = tp_va*10+chr1num(id_sep+1+tp_m); //计算角度
                gps_ang = tp_va;
        }
        else gps_ang = 360;
}

/*更新GGA相关数据---------------------------------------------------------
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
$GPGGA,120226.000,3143.9615,N,12003.2206,E,1,05,1.8,26.8,M,,,,0000*32
------------------------------------------------------------------------*/
void Analy_GGA(void)
{
        unsigned char tp_p,tp_j;
//卫星数 信息起点var_seg+1卫星数00~12
        gps_snum = chr2num(id_sep+1);
//精度 信息起点var_seg+1 0.1~9.9数据可用
        tp_p = id_sep-id_sep;
        if(tp_p==4)        gps_prec = chr1num(id_sep+1)*10+chr1num(id_sep+3);
        else gps_prec = 100;      //数据不可用
//海拔 信息起点var_seg+1 -999.9~9999.9m
        tp_p = id_sep-id_sep; //计算海拔信息长度
        gps_high = tp_p-1;
        if(tp_p>3){
                for(tp_j=1;tp_j<tp_p;tp_j++)
                        gps_high = buf_gps-tp_j]; //海拔信息反向储存               
        }
}

//清空buf
void buf_clear(void)
{
        unsigned char ci;
        for(ci=0;ci<96;ci++) buf_gps=' ';
}

/*数据输出------------------------------------------------------------------*/

//电池信息
void disp_bat(unsigned char ad_bat)
{
        if(var_bat!=ad_bat){
                unsigned int vol;
                var_bat = ad_bat; //更新数据
                vol = var_bat*10; vol/=51;//ad转电压 Vi = *AD*10
                L5_setxy(66,0);        line = 0x40;
                if(var_bat<178){ Lwr_ico(dip_bat0); EN_BLED(1);} //<3.5V
                else{
                        if(var_bat<199) Lwr_ico(dip_bat1);   //<3.9V
                        else{
                                if(var_bat<245) Lwr_ico(dip_bat2); //<4.8V
                                else{ Lwr_ico(dip_bat3); EN_LLED(1);}//>=4.8 电源开启背光
                        }
                        EN_BLED(0);
                }
                Lwr_nums(vol,2,1); //输出电压值
                S_LCE; //使能LCD
        }
}

//数据信号
void disp_sign(unsigned char sg)
{
        L5_setxy(70,3); line = 0x40;
        if(sg==1) Lwr_ico(dip_sign); //信号符号
        else Lwr_blank(14);          //清符号
        S_LCE; //使能LCD
}

//日期时间
void disp_datetime(void)
{
//第五行 -1-,5,-6-,4*8+4+4,-4-,4*6+2+2
        L5_setxy(0,4); line = 0x00; Lwr_ico(dip_clock); //时钟符号
        S_LCE; //使能LCD
//日期
        L5_setxy(12,4);
        Lwr_nums(20,2,0); Lwr_nums(gps_year,2,0);//年
        Lwr_ico(dip_minus);        Lwr_nums(gps_mon,2,0); //月
        Lwr_ico(dip_minus);        Lwr_nums(gps_day,2,0); //日
        S_LCE; //使能LCD
//时间
        L5_setxy(56,4);
        Lwr_nums(gps_hour,2,0);                  //时
        Lwr_ico(dip_colon);        Lwr_nums(gps_min,2,0); //分
        Lwr_ico(dip_colon);        Lwr_nums(gps_sec,2,0); //秒
        S_LCE; //使能LCD
}

//显示框架
void disp_frame(void)
{
        L5_setxy(0,0); line = 0x40; Lwr_blank(65); //第一行
        line = 0xc0; Lwr_blank(1);
        line = 0x40; Lwr_blank(18);
        S_LCE; //使能LCD
        L5_setxy(65,1); line = 0x1f; Lwr_blank(1); //第二行
        S_LCE; //使能LCD
        L5_setxy(50,2); line = 0xff; Lwr_blank(1); //第三行
        S_LCE; //使能LCD
        L5_setxy(0,3); line = 0x40; Lwr_blank(50); //第四行
        line = 0x7f; Lwr_blank(1);
        line = 0x40; Lwr_blank(33);
        S_LCE; //使能LCD
}

//更新数据
void data_updata(void)
{
//第一行 18+4*2,5,-4-,5,-1-,5+4*4,-4-,8+4*2+2
//状态输出
        L5_setxy(0,0); line = 0x40;
        if(gps_sata=='A') Lwr_ico(dip_GPS); //定位图标
        else Lwr_ico(dip_NGPS);             //未定位
        Lwr_nums(gps_snum,2,0);             //输出卫星数
        S_LCE; //使能LCD
//第二行 -1-,8+4*3+3,-4-,4*5+2+6,-15-,4*2+5
//航向
        L5_setxy(8,1); line = 0x00;
        if(gps_ang<360){
                Lwr_ico(dip_cours);
                if(gps_ang<10) Lwr_num(gps_ang);
                else{
                        if(gps_ang<100) Lwr_nums(gps_ang,2,0);
                        else Lwr_nums(gps_ang,3,0);
                }//角度
                Lwr_ico(dip_deg); //符号度
                if(gps_ang<10) Lwr_blank(8);
                else{
                        if(gps_ang<100) Lwr_blank(4);
                }//空白
        }
        else Lwr_blank(23); //清角度
        S_LCE; //使能LCD
//海拔
        L5_setxy(35,1);
        if(gps_high>2){
                unsigned char dj;
                Lwr_blank(24-gps_high*4);
                for(dj=gps_high;dj>0;dj--){
                        switch(gps_high){
                                case '-': Lwr_ico(dip_minus); break;
                                case '.': Lwr_ico(dip_dp); break;
                                default: Lwr_num(gps_high-48); break;
                        }
                }
                Lwr_ico(dip_m); //m
        }
        else Lwr_blank(28); //清海拔
        S_LCE; //使能LCD
//第三行 6+4*9+3+2+2,-3-4*4+2+14
//纬度
        L5_setxy(0,2);
        if(gps_lat=='N') Lwr_ico(dip_N); //'N'
        else Lwr_ico(dip_S);                //'S'
        Lwr_blank(4); Lwr_nums(gps_lat,2,0); Lwr_ico(dip_deg); //度
        Lwr_nums(gps_lat,2,0); Lwr_ico(dip_dp);   //分整数
        Lwr_nums(gps_lat,2,0);
        Lwr_nums(gps_lat,2,0); Lwr_ico(dip_cent); //分小数
        S_LCE; //使能LCD
//速度
        L5_setxy(52,2);
        if(gps_speed<100){ Lwr_blank(8); Lwr_nums(gps_speed,2,1);}
        else{
                if(gps_speed<1000){        Lwr_blank(4); Lwr_nums(gps_speed,3,1);}
                else Lwr_nums(gps_speed,4,1);
        }
        Lwr_ico(dip_kmh); //'kmh'
        S_LCE; //使能LCD
//第四行 6+4*9+3+2+2,-4-,3+4*2+2,-4-,13
//经度
        L5_setxy(0,3); line = 0x40;
        if(gps_lon=='E') Lwr_ico(dip_E); //'E'
        else Lwr_ico(dip_W);                //'W'
        Lwr_nums(gps_lon,3,0); Lwr_ico(dip_deg);//度
        Lwr_nums(gps_lon,2,0); Lwr_ico(dip_dp);   //分整数
        Lwr_nums(gps_lon,2,0);
        Lwr_nums(gps_lon,2,0); Lwr_ico(dip_cent); //分小数
        S_LCE; //使能LCD
//精度
        L5_setxy(53,3);
        Lwr_ico(dip_plus);
        if(gps_prec<100) Lwr_nums(gps_prec,2,1);
        else Lwr_ico(dip_infi);
        S_LCE; //使能LCD
//第五行 -1-,5,-6-,4*8+4+4,-4-,4*6+2+2
        disp_datetime(); //时钟符号、日期、时间
}

//进度条类型 0:等待,1:删除,2:上传,3:删除确认
void disp_schetype(unsigned char stype)
{
        L5_setxy(1,1); line = 0x00;
        switch(stype){
                case 0: Lwr_ico(dip_wait); break;
                case 1: Lwr_ico(dip_del); break;
                case 2: Lwr_ico(dip_upld); break;
                case 3: Lwr_ico(dip_del); Lwr_ico(dip_quest); break;
                case 4: Lwr_ico(dip_del); Lwr_num(1); Lwr_ico(dip_quest); break;
        }
        S_LCE; //使能LCD
}
//进度条 参数:输出标志; 除数; 被除数
void disp_sche(unsigned int s0,unsigned int s1)
{
        L5_setxy(6,1);
        if(s1<10) s1 = 1;   //被除数不能为0
        else s1/=5;
        s0 = (s0+1)*20/s1; s1 = s0/4; //s0/5*100 25份'%'
        if(s1>25) s1 = 25;
        line = 0x1f; Lwr_blank(1+s1);
        line = 0x11; Lwr_blank(25-s1);
        line = 0x1f; Lwr_blank(1);
        line = 0x00; //'99%'
        if(s0<10){ Lwr_num(s0); Lwr_ico(dip_per); Lwr_blank(8);}
        else{
                if(s0<100){ Lwr_nums(s0,2,0); Lwr_ico(dip_per); Lwr_blank(4);}
                else{ Lwr_nums(100,3,0); Lwr_ico(dip_per);}
        }//25+2+12+6=45
        S_LCE; //使能LCD
}
//进度条块清空
void clear_sche(void)
{
        L5_setxy(1,1); line = 0x00; Lwr_blank(64);
        S_LCE; //使能LCD
}

//显示运行状态
void disp_sata(void)
{
        L5_setxy(28,0); line = 0x40;
        if(flg_sata==1){
                Lwr_ico(dip_run); R_GPS;//运行//使能GPS
        }
        else{
                Lwr_ico(dip_stop); S_GPS; //暂停//禁止GPS
        }
        S_LCE; //使能LCD
}
//运行状态切换
void switch_sata(void)
{
        if(flg_sata==0) flg_sata = 1;
        else{ flg_sata = 0; gps_sata = 'V';}
        disp_sata();
}

//模式显示
void disp_mode(void)
{
        L5_setxy(71,1); line = 0x00;
        if(var_ts>9) Lwr_nums(var_ts,2,0);    //双数秒
        else{ Lwr_blank(4); Lwr_num(var_ts);} //单数秒
        Lwr_ico(dip_s);                     //'s'
        S_LCE; //使能LCD
}
//模式
void switch_mode(void)
{
        switch(var_ts){
                case 0:var_ts = 5; break;//5s
                case 5:var_ts = 10; break; //10s
                case 10: var_ts = 15; break; //15s
                case 15: var_ts = 30; break; //30s
                case 30: var_ts = 60; break; //60s
                case 60: var_ts = 90; break; //90s
                default: var_ts = 0; break;//手动
        }
        disp_mode();
}

//文件数输出
void disp_file(void)
{
        L5_setxy(41,0);        line = 0x40;
        Lwr_ico(dip_file);               //文件图标
        Lwr_nums(DataNumMax-data_num,4,0); //输出剩余储存空间数
        S_LCE; //使能LCD
}
//记录提示符号 0:清除,1成功,2失败
void disp_record(unsigned char recd)
{
        L5_setxy(35,0);        line = 0x40;
        if(recd==1) Lwr_ico(dip_wait); //文件图标
        else{
                if(recd==2) Lwr_ico(dip_del); //文件图标
                else Lwr_blank(5);
        }
        S_LCE; //使能LCD
}

//分析坐标是否变化
unsigned char tp_pl={0}; //先纬度,后经度
unsigned char analy_cgpl(unsigned char rmode)
{
        unsigned char pj,nosame=0;
        for(pj=0;pj<4;pj++){
                if(gps_lat!=tp_pl) nosame = 1;
                if(gps_lon!=tp_pl) nosame = 1;
                tp_pl = gps_lat;
                tp_pl = gps_lon;
        }
        if(rmode=='H') nosame = 1; //手动记录不判断重复
        return nosame;
}

//记录一组数据
void onerecord(unsigned char recmod)
{
        unsigned char asame;
        asame = analy_cgpl(recmod);
        //定位后并且有空间且精度在10.0内,数据不同
        if((gps_sata=='A')&&(data_num<DataNumMax)&&(gps_prec<100)&&asame){
                disp_record(1);
                i2c_buf = gps_day; //日
                if(recmod=='H') i2c_buf|=0x80; //手动=1,自动=0
                i2c_buf = (gps_mon<<4)|(gps_year&0x0f); //月+年
                i2c_buf = gps_hour; //时
                i2c_buf = gps_min;//分
                i2c_buf = gps_sec;//秒
                i2c_buf = gps_lat; i2c_buf = gps_lat;
                i2c_buf = gps_lat; i2c_buf = gps_lat;
                i2c_buf= gps_lon; i2c_buf = gps_lon;
                i2c_buf = gps_lon; i2c_buf = gps_lon;               
                i2c_wr_bytes(data_num*13); data_num++; //写入一组数据,数据数自增
                disp_file();
        }
        else disp_record(2);
}

//获取数据数量
void analy_datanum(void)
{
        unsigned char tp_r;
        clear_sche(); disp_schetype(0); //进度条块清空,等待符号       
        data_num = 0;
        disp_sche(0,DataNumMax); EN_LED(1); _nms(500); //进度条
        do{                  
                tp_r = i2c_rd_byte(data_num*13);
                if(tp_r==0xff) break;
                data_num++;
                disp_sche(data_num,DataNumMax); NO_LED(); //进度条
        }while(data_num<DataNumMax);
        disp_file(); clear_sche(); EN_LED(0);         //显示文件数,清进度条
}

//格式化,删除所有数据 ften:确认删除
void formatrecord(void)
{
        unsigned int tp_f;       
        if(data_num>0){                            //暂停时 有数据
                clear_sche(); disp_schetype(1); //进度条块清空,删除符号
                disp_sche(0,data_num); EN_LED(1); _nms(500); //进度条
                for(tp_f=0;tp_f<data_num;tp_f++){
                        disp_sche(tp_f,data_num); NO_LED(); //进度条               
                        i2c_wr_byte(tp_f*13,0xff);//写0xff               
                }
                data_num = 0; disp_file(); EN_LED(0);
        }
}

//删除上一数据
void onerecdel(void)
{
        if(data_num>0){                             //暂停时 有数据
                EN_LED(1); _nms(500); data_num--;//进度条
                i2c_wr_byte(data_num*13,0xff);   //写0xff
                disp_file(); EN_LED(0);
        }
}

//暂停时时间
void secondaddone(void)
{
        unsigned char tp_p,addday=0;
        if(gps_sec<59) gps_sec++;
        else{
                gps_sec = 0;
                if(gps_min<59) gps_min++;
                else{
                        gps_min = 0;
                        if(gps_hour<23) gps_hour++;
                        else{
                                gps_hour = 0;
                                addday = 1; //日期进位
                        }
                }
        }
        if(addday==1){ //判断日期是否进位
                switch(gps_mon){
                        case 4: case 6: case 9: case 11: tp_p = 30; break;
                        case 2: if(gps_year%4==0) tp_p = 29;
                                        else tp_p = 28;
                                        break;
                        default: tp_p = 31; break;
                }//判断当前月的天数
                if(gps_day<tp_p) gps_day++;
                else{
                        gps_day = 1;
                        if(gps_mon<12) gps_mon++;
                        else{ gps_mon = 1; gps_year++;}
                }//天数增一
        }
        disp_datetime(); //显示时钟符号、日期、时间
}

/* END ----------------------------------------------------------------------*/

/*
2、 GPS Satellites in View(GSV)可见卫星信息
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF>
$GPGSV,3,2,12,42,39,118,80,32,38,225,20,20,34,252,80,31,34,060,34*76
<1> GSV语句的总数
<2> 本句GSV的编号
<3> 可见卫星的总数,00 至 12。
<4> 卫星编号, 01 至 32。
<5>卫星仰角, 00 至 90 度。
<6>卫星方位角, 000 至 359 度。实际值。
<7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。
<8>Checksum.(检查位).
第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。
其余卫星信息会于次一行出现,若未使用,这些字段会空白。

1、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
$GPRMC,050459.000,A,2459.8990,N,10242.8698,E,0.67,158.73,190808,,,A*6A
$GPRMC,120225.000,A,3143.9615,N,12003.2206,E,0.00,,220810,,*1A
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输) *1.85=kmh
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式

2、Global Positioning System Fix Data(GGA)GPS定位信息
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
$GPGGA,050458.000,2459.8991,N,10242.8698,E,1,5,1.20,1885.0,M,-32.2,M,,*45
$GPGGA,120226.000,3143.9615,N,12003.2206,E,1,05,1.8,26.8,M,,,,0000*32
<1> UTC时间,hhmmss(时分秒)格式
<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<3> 纬度半球N(北半球)或S(南半球)
<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<5> 经度半球E(东经)或W(西经)
<6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
<7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
<8> HDOP水平精度因子(0.5~99.9)
<9> 海拔高度(-9999.9~99999.9)
*/

wjr888 发表于 2013-6-5 20:16:20

本帖最后由 wjr888 于 2013-6-5 20:25 编辑

skype 发表于 2013-6-5 17:37 static/image/common/back.gif
纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
经度dddmm.mmmm(度分)格式(前面的0也将被传输)



多谢您的回复,貌似是上面小数点后面比其他模块多出一位来(下图),据说是为了表明UBLOX模块精度比其他品牌的高才这么设计的,请结合楼上程序帮忙再 看看如何改程序啊?


   
      

skype 发表于 2013-6-5 21:58:01

小数点后多少位都没有关系,下面是实现代码,直接拷贝过去就可以用的:
typedef struct
{
        uint8_t        second;
        uint8_t        minute;
        uint8_t hour;                                                                                                               
}time;

typedef struct
{                                                       
        uint8_t day;
        uint8_t month;
        uint8_t year;       
        uint8_t week;                                                       
}date;


/*
GPRMC推荐定位信息(GPRMC)
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
*/
//经纬度buf长度
#define JWD_BUTF_LEN                        13
typedef struct
{        //GPRMC
    uint8_t UTC_Time;                                    
    uint8_t POS_state;
    uint8_t WD_Lat;             //加\0
    uint8_t NS_WD;
    uint8_t JD_Long;            //加\0
    uint8_t EW_JD;
    uint8_t Speed;
    uint8_t Azimuth;
    uint8_t UTC_Date;
        date                GPS_date;                                                                                //日日月月年年
        time                GPS_time;                                                                                //时分秒
    double        WD_Latitude;                                                                                //纬度       
        double        JD_Longitude;                                                                                //经度
}GPS_GPRMC;


GPS_GPRMC GPS_INFO;


//*Buffer GPS数据缓冲区地址,Len数据长度
void GprmcMessage(uint8_t *Buffer, uint8_t Len)
{
    uint8_t day;
        uint8_t CommaNum; //逗号数
        uint8_t BufIndex; //数字量
        uint8_t Sbuf;
        uint8_t *Pstr;
   
        int latitude_Degree, longitude_Degree;
        double lati_cent_tmp;
        double long_cent_tmp;
    uint32_t wd, jd;
        memset(&GPS_INFO, '\0', sizeof(GPS_INFO));//清除结构体       
        //$GPRMC,<UTC时间>,<有效状态>,<纬度>,<纬度半球>,<经度>,<经度半球>,<地面速率>,<地面航向>,<UTC日期>,<磁偏角>,<磁偏角方向>,<模式指示>*<校验和><CR><LF>
        //NMEA0183语句(推荐定位信息(GPRMC))
        //$GPRMC,100259.00,A,3119.26216,N,12024.85164,E,2.447,,020613,,,A*7C
    //      1         2 3          4 5          6 7   8   9      ABC
    BufIndex=0;         //数字量
    CommaNum=0;         //逗号数
    Pstr=Buffer;          //找到GPRMC,后面的地址
    do
    {
      Sbuf=*Pstr++;       
      
      switch(Sbuf)
      {
            case ',':   CommaNum++;BufIndex=0;    break;//通过逗号的数目来进行状态分类
            case '*':                               break;
            default:
                  switch(CommaNum)
                  {
                        case 1: GPS_INFO.UTC_Time=Sbuf;       break;
                        case 2: GPS_INFO.POS_state=Sbuf;                break;
                        case 3: GPS_INFO.WD_Lat=Sbuf;         break;
                        case 4: GPS_INFO.NS_WD=Sbuf;                  break;
                        case 5: GPS_INFO.JD_Long=Sbuf;      break;
                        case 6: GPS_INFO.EW_JD=Sbuf;                  break;
                        case 7: GPS_INFO.Speed=Sbuf;          break;
                        case 8: GPS_INFO.Azimuth=Sbuf;      break;
                        case 9: GPS_INFO.UTC_Date=Sbuf;       break;
                        default:break;
                  }
                  BufIndex++;        //
                  break;
      }
    }while(Sbuf!='*');//直到出现‘*’退出          
}

win2kddk 发表于 2013-6-5 22:04:47

伸手党                  

wjr888 发表于 2013-6-5 22:11:07

本帖最后由 wjr888 于 2013-6-5 22:29 编辑

谢谢!不过小弟实在不懂这段程序要替换到原程序哪里才行?望明示。

wjr888 发表于 2013-6-5 22:40:04

win2kddk 发表于 2013-6-5 22:04 static/image/common/back.gif
伸手党

不愿意帮助别人就算了,说这些没意思。
页: [1]
查看完整版本: 请问UBLOX gps模块后五位与后四位不兼容怎么办?