gisempire100
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1559回复:0

GPS串口数据接收程序实例

楼主#
更多 发布于:2008-01-14 12:55
  <STRONG>摘  要</STRONG>:目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款EverMore公司的GM-X205GPS接受模块为例,介绍了其数据格式,以及应用PIC16F874单片机RS232串口进行数据接收的程序。
<P>    <STRONG>关键词</STRONG>:GPS、NMEA格式、PIC16F874、串口数据接收</P>
<P>    <STRONG>1、 GPS应用简介</STRONG></P>
<P>    近年来GPS系统,已经在大地测绘、海上渔用、车辆定位监控、建筑、农业等各个领域得到广泛应用。从九十年代我国引进GPS定位技术开始,经过十多年的市场培育,GPS定位应用进入了发展的最好时机,未来十年基于GPS的应用将会改变我们的生活和工作方式。</P>
<P>    目前市场上的大部分GPS接受模块都是通过RS232串口与MCU进行数据传输的。这些数据包括经度、纬度、海拔高度、时间、卫星使用情况等基本信息。开发人员再依据这些基本数据,进行数据处理来完成整套的定位系统软件。</P>
<P>    <STRONG>2、 GM-X205模块数据格式</STRONG></P>
<P>    在进行数据接受编程之前,先介绍一下该模块的数据格式。它支持NMEA-0183输出格式。信息如下:</P>
<P>    GGA位置测定系统定位资料(Global Positioning System Fix Data)<BR>    GSV 导航卫星资料(GNSS Satellites in View)<BR>    RMC导航卫星特定精简资料(Recommended Minimum Specific GNSS Data)<BR>    VTG 方向及速度等相关资料(Course Over Ground and Ground Speed)<BR>    由于文章篇幅问题,笔者在这里只以接收GGA数据为例,格式如下:<BR>    $GPGGA,hhmmss,dddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS<BR>    例:$GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M,,,,*1F</P>
<P> </P>
<P>说明见表:</P><!--mstheme-->
<TABLE  cellSpacing=0 borderColorDark=#ffcc33 cellPadding=0 borderColorLight=#ffcc33 border=1>

<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>区域</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>名称</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>例</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P>单位</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>说明</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>1</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>信息ID</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>$GPGGA</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>GGA协议开始</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>2</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>UTC时间</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>033744</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>hhmmss</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>3</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>纬度</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>2446.5241</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>dddmm.mmmm</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>4</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>南/北半球指示</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>N</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>N=north ; S=south</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>5</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>经度</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>12100.1536</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>dddmm.mmmm</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>6</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>东/西半球指示</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>E</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>E=east ; W=west</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>7</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>定位指示</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>1</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>0 =未定位</P>
<P>1=定位SPS模式</P>
<P>2=定位DGPS, SPS模式</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>8</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>应位卫星数</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>10</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>00-12</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>9</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>HDOP</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>0.8</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P>米</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>10</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>海拔高度</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>133.4</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P>米</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>11</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>海拔高度单位</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>M</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P>米</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>12</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>WGS84水准面划分</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>13</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>WGS-84水准面划分单位</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>14</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>累计GPS数据微分</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>本模块中不可用</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>15</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>参考工作站ID</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P>本模块中不可用</P><!--mstheme--></FONT></TD></TR>
<TR>
<TD  vAlign=top width=67><!--mstheme--><FONT face=宋体>
<P>16</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=196><!--mstheme--><FONT face=宋体>
<P>校验位</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=131><!--mstheme--><FONT face=宋体>
<P>*1F</P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=69><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD>
<TD  vAlign=top width=194><!--mstheme--><FONT face=宋体>
<P> <P> </P></P><!--mstheme--></FONT></TD></TR></TABLE><!--mstheme--><FONT face=宋体>
<P>上面例子中,我们可读出位置信息:北纬24度46.5241分,西经121度00.1536分<BR>                                格林威治时间:3点37分44秒<BR>3、 PIC16F874数据接收程序<BR>笔者在系统中把接收到的数据处理后,显示到图形液晶屏上。限于篇幅在这里只给出数据接收部分程序,并且只接收经度和时间信息,并且给出格林威治时间转换为北京时间的转换函数。其他数据接收程序类似。<BR>;**********************************************************<BR>;         THIS IS A GPS RECEIVER PROGRAM                  *<BR>;**********************************************************<BR>         LIST P=16F874<BR>         INCLUDE P16F874.INC       <BR>;*******寄存器定义 ********************<BR>TEMP1     EQU    0X27<BR>W_TEMP    EQU    0X54         <BR>STATUS_TEMP  EQU 0X55<BR>LONG1     EQU    0X40          ;LONG1--- LONG10经度的10位数据<BR>LONG2     EQU    0X41<BR>LONG3     EQU    0X42<BR>LONG4     EQU    0X43<BR>LONG5     EQU    0X44<BR>LONG6     EQU    0X45<BR>LONG7     EQU    0X46<BR>LONG8     EQU    0X47<BR>LONG9     EQU    0X48<BR>LONG10    EQU    0X49<BR>T1        EQU    0X58           ;T1---T6时间的6位数据<BR>T2        EQU    0X59<BR>T3        EQU    0X60<BR>T4        EQU    0X61<BR>T5        EQU    0X62<BR>T6        EQU    0X63<BR>;********************************************************<BR>       ORG  00H<BR>       NOP<BR>       NOP<BR>       GOTO MAIN<BR>       ORG  04H          ;设定按中端健才开始数据接受<BR>       NOP<BR>       NOP<BR>       GOTO INTERRUPT<BR>;*********判断头文件是不是'$GPGGA’**********<BR>IDMESSAGE<BR>        BCF     STATUS,RP0<BR>BREAK0 <BR>     CALL      PAND<BR>        MOVWF     TEMP1<BR>        MOVLW     '$'        ;detect $<BR>        SUBWF     TEMP1,0<BR>        BTFSS     STATUS,Z<BR>        GOTO   BREAK0<BR>        CALL     PAND<BR>        MOVWF     TEMP1<BR>        MOVLW     'G'        ;detect G<BR>        SUBWF     TEMP1,0<BR>        BTFSS     STATUS,Z<BR>        GOTO   BREAK0<BR>        CALL     PAND<BR>        MOVWF     TEMP1<BR>        MOVLW     'P'        ;detect P<BR>        SUBWF     TEMP1,0<BR>        BTFSS     STATUS,Z<BR>        GOTO  BREAK0<BR>        CALL     PAND<BR>        MOVWF     TEMP1<BR>        MOVLW     'G'        ;detect G<BR>        SUBWF     TEMP1,0<BR>        BTFSS     STATUS,Z<BR>        GOTO  BREAK0<BR>        CALL     PAND<BR>        MOVWF     TEMP1<BR>        MOVLW     'G'        ;detect G<BR>        SUBWF     TEMP1,0<BR>        BTFSS     STATUS,Z<BR>      ;n</P></FONT>
喜欢0 评分0
A friend is never known till a man has need. ...CL
游客

返回顶部