2 从GPS接收机获取实时时间
GPS是美国开发研制的最初主要作为军用的一种全球定位系统,有三个部分组成:空间部分、地面监控部分和用户部分。一般来说,在地面上的GPS接收机能接收5~12个卫星信号,而为了获得地面上的定位坐标,至少需要4颗卫星的信号,三个用来确定GPS接收机的纬度、经度和海拔高度,第四个则提供同步校正时间。
GPS接收机只要处于工作状态就会源源不断地把计算出的GPS导航定位信息通过串口传送到计算机中。GPS接收机送出的数据都是格式化的,NMEA一0183协议是GPS接收机应当遵循的标准协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。下面介绍下如何从符合NMEA—0183协议的接收机接收数据中提取时间信息。
接收机通过串口发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有“$GPGGA”、“$GPGSA”、“$GPGSV”以及“$GPRMC”等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从“$GPRMC”帧中获取得到,该帧的结构及各字段释义如下:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh<CR><LF>
<1>当前位置的格林尼治时间,格式为hhmmss
<2>状态,A为有效,V为接收警告,即当前天线视野上方的卫星个数少于3颗。
<3>纬度,格式为ddmm.mmmm
<4>标明南北半球,N为北半球、S为南半球
<5>径度,格式为dddmm.mmmm
<6>标明东西半球,E为东半球、W为西半球
<7>地面上的速度,范围为0.ON999.9
<8>方位角,范围为000.O到359.9度
<9>日期,格式为ddmmyy
<lO>地磁变化,从000.0到180.O度
<ll>地磁变化方向,为E或W
在Linux操作系统中,从$GPRMC数据帧中提取时间信息的代码如下:
程序首先打开串口,然后对串口参数进行配置,随后进入无限循环主体。这段代码是作为主进程的一个线程实现串口数据的接收,当串口接收缓冲区中无数据时,read函数阻塞。程序中只提取了时间信息,若需导航数据可以类似方法提取。
3 结束语
本文分别介绍了两种嵌入式系统中获取实时时间的方法:时钟芯片方法和GPS接收机方法。时钟芯片方法的优点是硬件连接简单、成本低;缺点是存在积累误差、易受环境影响、可靠性差。GPS接收机的优点:由于GPS卫星使用的是可以精确到十亿分之一秒的原子钟,所以不存在时间误差问题。同时也应该看到,目前GPS核心技术在国外,国内GPS市场主要还是做代理或是在购买国外GPS模块的基础上做产品开发,这就使得开发成本偏高。GPS方法中还有一个问题就是在某些情况下接收不到GPS信号,如在高楼林立的环境下或是在地下室之类的地方。此时就应该让GPS接收机方法与处理器内部的实时时钟(RTC)配合工作,这样在短时接收不到GPS信号的情况,仍可以从RTC读取时间。