Arduino 通过OLED显示GPS接收信息(补充)
在上篇文章 Arduino 通过OLED显示GPS接收信息 中,我们基于Arduino平台使用U8x8库实现了对SSD1306 12684液晶屏的驱动,并实时显示GPS信息。在代码中细心地 Akul 发现时间大于24点时,显示为24:XX分,甚至25:XX分,所以本文首先对原代码作一些修补。
GPS接收UTC时间的补充
在 Arduino 通过OLED显示GPS接收信息 文中代码部分有下面的代码:
int hour = fix.dateTime.hours + 8;//根据时区设置
其目的是将GPS接收到的定位点的UTC时间进行解码, 代码解析出小时后根据定位点的时区对时间进行修正,使之显示为定位点的实际时间,因为中国在国际时区中位于东8区,因此小时数+8.

实际测试中发现,当实际时间大于等于24时,显示为24:XX、25:XX到31:XX,直到UTC时间回零才能显示正常时间。分析代码后发现,该问题是由于简单的用UTC时间+8导致,由于出现该问题都是在定位点0点~凌晨07点,所以前期居然没能发现,再次感谢细心地 Akul 。
解决思路:在代码中加入一段判断,当定位点时间大于等于24时,小时减掉24,这样就能得到真实的定位点时间了。加入代码如下:
................... int hour = fix.dateTime.hours + 8;//根据时区设置 int minute = fix.dateTime.minutes; if ( hour >= 24) { hour = hour -24; } ...................
经过调整,时间能正常显示了,待运行一段时间看是否还有其它问题。
GNRMC格式解析
GPS模块接收标准信号协议中GNRMC格式如下:
$GNRMC,084852.000,A,2236.9453,N,11408.4790,E,0.53,292.44,200310,,,A*7 5
其中:
084852.000,代表UTC时间,格式为hhmmss.sss(时分秒.毫秒)
A,代表定位状态,A指有效定位,V指无效定位
2236.9453,N, 代表定位点的纬度
11408.4790,E, 代表定位点的经度
0.53, 代表地面速率
292.44, 代表地面航向
200310, 代表UTC日期
,
,磁偏角,范围:000-180
,
,磁偏角方向,E东,W西
A*75 代表模式指示