$GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC时间,hhmmss(时分秒)
(2) 定位状态,A=有效定位,V=无效定位
(3) 纬度ddmm.mmmmm(度分)
(4) 纬度半球N(北半球)或S(南半球)
(5) 经度dddmm.mmmmm(度分)
(6) 经度半球E(东经)或W(西经)
(7) 地面速率(000.0~999.9节)
(8) 地面航向(000.0~359.9度,以真北方为参考基准)
(9) UTC日期,ddmmyy(日月年)
(10)磁偏角(000.0~180.0度,前导位数不足则补0)
(11) 磁偏角方向,E(东)或W(西)
(12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
可以通过GPS模块的配置软件让模块只输出这一条语句,也可以通过判断第四位的字符是不是"M"从这几条语句中筛选出$GPRMC语句。编程的流程图如下图所示:
这样解码的效率较低,但不影响效果。可以在串口接收中断里定义一个5位的命令类型数组,在中断内就判断命令的类型,这样免去了每条命令都完全接收的麻烦。这里卫星解码过后的定位数据、时间数据可以直接用1602和12864显示。由于我的课设需求是要有一个基于LabView的上位机显示,所以还需要考虑串口被占用的问题。由于还有其他数据需要处理,加之用普通IO口模拟串口输出效率较低需要占用较多资源,所以暂定用三态门拓展串口。以后不定期再更新完善,欢迎各位交流指点。1602和12864显示的代码就添加在附件里了。