找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4733|回复: 3
打印 上一主题 下一主题
收起左侧

单片机解读GPS信息

  [复制链接]
跳转到指定楼层
楼主
ID:486556 发表于 2019-3-7 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用单片机解读GPS信息是GPS模块使用最重要的环节,由于汲设到产品的保密问题,这里只介绍时间的处理方法,而方位、速度的处理方法不做介绍,但通过时间的处理方法,同样可以处理方位、速度。
1、        获取GPS模块的输出信息
由于GPS模块每秒输出一次:$GPGGA 、$GPGSA、$GPGSV、 $GPRMC数据。速率慢,因此必须采用中断方式接收!(采用查询会造成数据丢失),而且单片机只需要处理$GPRMC信息,即可得到时间、方位、速度。程序采用C51编制,在Keil C中编译!

code unsigned char GPS_ASC[]="$GPRMC" ;  //定义特征字符串
unsigned char idata RsBuf[60];
//**********************************************************

//读取GPS模块串口数据, 采用中断方式
void GetRs232_Data() interrupt 4
{
        unsigned char i;
        unsigned int j;
        if (RI){
                RI=0;
                RsBuf[0]=SBUF;
                if (RsBuf[0]=='$'){   //是GPS数据的开始,进入查询接收
                       for (i=1;i<sizeof(GPS_ASC)-1;i++){
                               j=GetUartDat();     //接收下一个数据
                               if (j<256) {
                                       RsBuf=(unsignedchar)j;
                                       if(RsBuf!=GPS_ASC) return;  
                               }        
                       }
//判别是否为$GPRMC数据,是继续接收!
                       for (;i<sizeof(RsBuf);i++){
                               j=GetUartDat();      
                               if (j<256) {
                                       RsBuf=(unsignedchar)j;
                               }else{
                                       break;
                               }        
                       }
//       接收完毕处理数据!
                       if (1==JiaoYanDat(RsBuf)){
                               FormatTimer(RsBuf);           //格式化时间               
                               FormatSpeed(RsBuf);          //处理速度
                       }
                }
        }
}
//    2、       接收数据的处理
//数据处理前,必须要再次检验是否为$GPRMC信息。
unsigned char JiaoYanDat(unsigned char *p){
        unsigned char *pP;
        pP=strstr(p,GPS_ASC);
        if (pP == NULL) return 0;
        return 1;               
}
//     3、接收的数据全部转换成二进制数据,便于纠错处理。
unsigned char ASC_To_Bin(unsigned char *p){
        unsigned char i;
        if (p[0]<'0' || p[0]>'9') return 0;
        if (p[1]<'0' || p[1]>'9') return 0;
        i=(p[0]-'0')*10;
        return (i+p[1]-'0');
}
//     4、时间调整
//由于GPS模块采用格林威治时间,与北京时间相差8个时区,所以要加入8小时。
unsigned char TurnGLW(unsigned char GLW){
        return (GLW+8)%24;
}            
//     5、       格式化标准时间
//  定义一个时间的数据结构:
typedef struct{
        unsigned int  ms;
        unsigned char Sec;
        unsigned char Min;
        unsigned char Hour;
        unsigned char Day;
        unsigned char Mon;
        unsigned char Week;
        unsigned char Year;
}TIMER;
//由于GPS模块输出的毫秒不准,所以时间数据结构中的ms变量数据不准!请不要随便使用!
void FormatTimer(unsigned char *p){
        unsigned char i;
        Timer.ms=(p[14]-'0')*100+(p[15]-'0')*10+p[16]-'0';
        Timer.Hour=TurnGLW(ASC_To_Bin(&p[7]));
        Timer.Min=ASC_To_Bin(&p[9]);
        Timer.Sec=ASC_To_Bin(&p[11]);
        if (p[50]==','){
               Timer.Day=ASC_To_Bin(&p[51]);        
               Timer.Mon=ASC_To_Bin(&p[53]);        
               Timer.Year=ASC_To_Bin(&p[55]);        
        }
}
//    6、 单片机接收串口的数据
//由于单片机接收GPS后续数据,采用了查询方式!所以要注意避免死机!必须要带超时处理!
unsigned int GetUartDat(void){
        unsigned int i=0,j=0;
        RI=0;
        while(!RI){
                if(i++>30000){  //超时时间
                       j=256;
                       return j;         //退出标志
                }
        }
        j=SBUF;
        RI=0;
        return j;
}
//    7、单片机的串口设置
//    采用89C52接收GPS数据的串口设置
#define  OSC               0                //定义使用晶振0=11.0592  1=18.4320
#if OSC
        code char BPSAsc[]={
        0x60,0xb0,0xd8,0xec,0xf6,0xfb,0xfb,
        };        //18.4320MHz
#else
        code char BPSAsc[]={
        0xa0,0xd0,0xe8,0xf4,0xfa,0xfd,0xfd,
        };        //11.0592MHz
#endif
//  串口设置
void InitBps (char Bps ){
        PCON &=0x7f;        //PCON。7==0
        SCON =0x50;        //设置成串口1方式
        TH1=BPSAsc[Bps];  //22.1184必须*22004-12-16
        TL1=TH1;
        TR1=1;
}
四、NEMA 0183协议祥解
该协议为NAEA 0183 20版(此协议是为了在不同的GPS导航设备中建立统一的RTCM标准)。
下列命令描述了GPS 25导航仪的数据格式定义,包括波特率选择,秒脉冲输出,RTCM定义输出。

1、NMEA接收语句
*GPS 25输入语句,主要为初始化,参数设置导通过RXP管脚
(1)ALM(历书信息)格式:$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、<12>、<13>、<14>、<15>、*hh<CR><LF>
如果板上的备用电池耗完,用此语句初始化信息
<1>在历书下传时能将历书总数传至GPS板上,当发送历书到GPS板上此字段可空或任意数。
   <2>当前历书数20这个字段可为空或任意值;
   <3>卫星PRN数不清0到32
   <4>GPS星历数
   <5>SV状态,每个历书的17-24位
   <6>离心率
   <7>星历参考时间
   <8>倾角
   <9>上升速率
  <10>半轴
  <11>近地点的末端
  <12>节经度
  <13>近点离角
  <14>Afo 时间参数
  <15> Af1 时间参数
   hh:语句末端的hh为该语句的校检符,应由用户计算送给GPS 25板,计算规则为:“S”后的所有字节的8个计,每4个组成一个BCD码(A、B、C等应用大写)。GPS 25输出,语句后均有校验位,用户可通过它,验证结果。
(2)初始化信息命令(仅在GPS 25上用)
$PGRMI用来初始化板子设定卫星位置和时间
该语句一般在裙位置和当前实际位置的距离超过800公里时使用,以回忆定位速度
格式:$PGRMI$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、*hh<CR><LF>
  <1>纬度ddmm.mmm格式(初始化必须被写入板子)
  <2>纬度方向N或S
  <3>经度ddmm.mmm格式(初始化必须被写入板子)
  <4>经度方向E或N
  <5>当前UTC日期,kkmm yy格式
  <6>当前UTC时间hhmm ss格式
(3)板子配置信息命令(仅用于GPS 25)
$GPALM配置接收板上的参数,存储在备用电池上。
$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、<12>、*hh<CR><LF>
  <1>合适的工作模式A——自动,2——2D模式,3—3D模式
  <2>海平面高度-1500.00~1800.00米
  <3>地理坐标索引
  <4>用户在地坐标
  <5>用户大地坐标精度
  <6>用户大地坐标 x轴
  <7>用户大地坐标 y轴
  <8>用户大地坐标z轴
  <9>差分模式A—自动(激活时自动输出差分信息)D—差分模式
  <10>NMEA波特率1=200 2=2400 3=4800 4=9600
  <11>速度滤波器状态0=不过滤  1—自动 2~255=滤波器时间常数
  <12>PPS模式:1=无Z=1HZ
  波特率和PPS的改变在重新加电或PIN6初始化后发挥作用。
(4)输出语句的激活(仅适用于GPS 25)
$PGRMO决定是否进行语句输出。
$PGRMO<1>、<2>*hh<CR><LF>
(1)语句描述
(2)语句模式0—关闭特殊1 —开启特  2—关闭所有  3—开启所有(除GPALM)
注意:(1)如果为2或3时,不做检验。允许有空字段
(2)如果为0或1时,描述字段必须被定义
(3)如果如果都不作用时(指上语句中<1><2>),该语句无影响
(4)$PGRMO、GPALM、1将传送所有昨历

2、NMEA的发送语句
   通过TXD管脚(GPS 25板上)
(1)传输速率
     用户可自定义
     传输长度表传输长度=传输总字符数/每秒传输数
波特率        每秒传输数       语句        最大字符
1200        120        GPGGA       72
2400        240        GPGSA       65
4800        480        GPGSV       210
9600        960        GPRMC       70
                GPVTG       34
                PGRME       36
                PGRMT       47
                PGRMV       26
                PGRMF       79
                LCGLL       36
                LCDTG       34
缺省波特率为48000。
(2)时间传输
     输出UTC时间和日期,通过计算板上时间得到当前日期时间。
(3)全球卫星的星历(ALM)
$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、<12>、<13>、<14>、<15>、*hh<CR><LF>
I 不能正常传送,要通过$PGRMO、GPALM、1命令初始化后得到
*在读取输出语句时数据之间最好用“、”区分,不要按位读取,以保证应用程序兼容性
(4)位置信息(GGA)
$GPGGA、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、M, <11>、<12>*hh<CR><LF>
    <1>UTC时间,hh mm ss格式(定位它的)
    <2>经度dd mm mmmm 格式(非0)
    <3>经度方向 N或S
    <4>纬度ddd mm mmmm 格式(非0)
    <5>纬度方向E或W
    <6>GPS状态批示0—未定位 1—无差分定位信息 2—带差分定位信息
    <7>使用卫星号(00~08)
    <8>精度百分比
    <9>海平面高度
    <10>*大地随球面相对海平面的高度
    <11>差分GPS信息
    <12>差分站ID号 0000-123
(5)GPS  DOP 和活动卫星
  $GPGSA、<1>、<2>、<3>、<3>、<3>、<3>、<3>、<3>、<3>、<3>、<3>、<3>、<3>、<3>、<4>、<5>、<6>、*hh<CR><LF>
    <1>模式M—手动,A—自动
    <2>当前状态 1—无定位信息,2—2D  3—3D
    <3>PRN号01~32
    <4>位置精度
    <5>垂直精度
    <6>水平精度
(6)当前GPS卫星状态(GSV)
    $GPGSV、<1>、<2>、<3>、<4>、<5>、<6>、<7><4>、<5>、<6>、<7>*hh<CR><LF>
    <1>GSV语句的总数目
    <2>当前GSV语句数目
    <3>显示卫星的总数目00~12
    <4>卫星的PRV号星号
    <5>卫星      仰角
    <6>卫星      旋角
    <7>信操比
    语句共两条,第条最多包括4颗星的处所。每个星有4个数据,即<4>—星号 <5>—仰角<6>—方位<7>—信噪比
(7)最简特性(RMC)
$GPRMC、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、*hh<CR><LF>
    <1>定位时UTC时间hhmmss 格式
    <2>状态A=定位V=导航
    <3>经度ddmm.mmm 格式
    <4>经度方向N 或S
    <5>纬度dddmm.mmmm
    <6>纬度方向E或W
    <7>速率
    <8>方位敬爱(二维方向指向,相当于二维罗盘)
    <9>当前UTC日期ddmmyy 格式
    <10>太阳方位
    <11>太阳方向
(8)VTG速度相对正北的方向
  $GPVTG、<1>、T、<2>、M、<3>、N、<4>K*hh<CR><LF>
<1>真实方向<2>、相对方向<3>步长<4>速率
(9)带有LORAN ID的地理信息命令
LCGLL 报告位置信息
     $LCGLL、<1>、<2>、<3>、<4>,<5><CR><LF>
1、        经度,ddmm .mm格式
2、        经度方向 N或S
3、        纬度,dddmm .mm格式
4、        纬度方向 E或W
5、        UTC时间(定位点)hhmmss格式
(10)带有LORAN ID的轨迹,速度信息
LCVTG报告轨迹和速度信息
    $LCVTG、<1>、T、<2>、、<3>、N、<4>,K,<CR><LF>
1、        真实方向(相对于正北)
2、        相对方向
3、        步长
4、        速率
(11)评估错误信息
$PGRME 报告评估错误信息
    $PGRME、<1>、M、<2>、M、<3>、M、*hh<CR><LF>
1、        GPS星号(0-1023)
2、        附加PGS(0-604799)
3、        UTC日期(当前点)hhmmss格式
4、        UTC时间(当前点)hhmmss格式
5、        GPS跳跃秒数
6、        经度,ddmm.mmmm格式
7、        经度方向,N或S
8、        纬度,dddmm.mmmm格式
9、        纬度方向,E或W
10、模式 M=手动  A=自动
11、定位类型   0=没定位  1=2D  2=3D
12、速率
13、方位角
(13)状态信息
$PGRMT、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>*hh<CR><LF>
报告板子状态语句
1、        产品名称,模式和软件版本
2、        自测 P-通过 F-失败
3、        接收检测 P-通过  F-失败
4、        储存数据状态 R-保留 L-丢失
5、        时钟数据状态  R-保存 L-丢失
6、        晶振检测 P-通过 F-测试有误
7、        数据采集 C-收集  空时为不收集
8、        板子温度 ℃
9、        板子配置数据 R-保留 L-丢失
(14) 3D定位信息
$PGRMV、<1>、<2>、<3>*hh<CR><LF>
1、        向东真实速率  -999.9to 9999.9
2、        向北真实速率  -999.9to 9999.9
3、        垂直速率     -999.9 to 9999.9
$GPGSA,A,1,,,,,,,,,,,,,99.9,99.9,99.9*09
$PSNY,0,00,05,500,06,06,06,06*14
$GPVTG,000.0,T,,M,000.0,N,000.0,K*60
$GPGGA,062320,3537.8333,N,13944.6667,E,0,00,99.9,0100,M,,M,000,0000*7D
$GPGLL,3537.8333,N,13944.6667,E,062320,V*3B
$GPRMC,062320,V,3537.8333,N,13944.6667,E,000.0,000.0,030222,,*0D
$GPZDA,062320,03,02,2022,,*4E
$GPGSV,1,1,00,,,,,,,,,,,,,,,,*79
$GPVTG,000.0,T,,M,000.0,N,000.0,K*60
$GPGGA,062321,3537.8333,N,13944.6667,E,0,00,99.9,0100,M,,M,000,0000*7C
$GPGLL,3537.8333,N,13944.6667,E,062321,V*3A
$GPRMC,062321,V,3537.8333,N,13944.6667,E,000.0,000.0,030222,,*0C
$GPZDA,062321,03,02,2022,,*4F
$GPGSA,A,1,,,,,,,,,,,,,99.9,99.9,99.9*09
$PSNY,0,00,05,500,06,06,06,06*14
$GPVTG,000.0,T,,M,000.0,N,000.0,K*60
$GPGGA,062322,3537.8333,N,13944.6667,E,0,00,99.9,0100,M,,M,000,0000*7F
$GPGLL,3537.8333,N,13944.6667,E,062322,V*39
$GPRMC,062322,V,3537.8333,N,13944.6667,E,000.0,000.0,030222,,*0F
$GPZDA,062322,03,02,2022,,*4C

评分

参与人数 2黑币 +55 收起 理由
ricardo60472174 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:447439 发表于 2021-1-21 09:45 | 只看该作者
学习下,最近在研究UBLOX m8n模块。看到你的文章有点思路了。
回复

使用道具 举报

板凳
ID:260407 发表于 2022-10-11 09:52 | 只看该作者
学习下,最近在研究
回复

使用道具 举报

地板
ID:1086148 发表于 2023-7-17 17:39 | 只看该作者
非常感谢楼主作品, 仔细阅读了, 非常好!  谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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