2.2 GPS数据提取
一般情况下,GPS接收机只要处于工作状态,就会源源不断地把接收到的信息通过串口传送到主控制板中。它的每一条NMEA语句都是以“$”为开始标志、以“\n”为结束标志。接收到的GPRMC语句格式为:
其中,CR、LF分别表示ASCII字符“回车”和“换行”,hh代表了“$”和“*”之间所有字符的按位异或值(不包括这两个字符)。其含义见表1所列。
通过读串口得到的数据可能会出现两种情况,一种情况是每次读到的数据中都会有完整的GPRMC语句,另一种情况是GPRMC分两次获得。获得完整的句子之后。接着判断得到的句子是否为GPRMC语句(即判断句子是否以GPRMC开头),如果是GPRMC语句,再就开始判断每个数据格式是否正确,包括表1中的UTC时间格式、定位有效性、纬度格式、纬度半球表示方法、经度格式、经度半球表示方法、UTC日期格式信息等,最后还将“$”和“*”之间的所有字符按位异或(不包括这两个字符),并计算校验和,看其是否为hh值(“*”之后的值)。
判断语句是否为GPRMC语句的流程如图2所示。
其部分关键函数如下所示:
int Init();初始化函数,用来打开串口,进行串口设置(波特率、数据位、校验位)等;
void Tick ();读串口数据函数;
void Cleanup ();关闭串口函数;
void Decode(char*szData);判断GPRMC语句函数;
bool VeriLine(char*szBuffer);判断GPRMC语句中数据格式是否正确函数;
void DecodeLine (char*szBuffer);提取GPRMC语句中有用信息并打印,包括时间、经
纬度、日期。
以下是部分相关函数:
bool VeriLine(char*szBuffer);判断GPRMC语句中数据格式是否正确函数;
bool VeriTimeForm(char*szBuffer2);判断时间格式函数;
bool VeriLonForm(char*szBuffer2);判断经度格式函数;
bool VeriLatForm(char*szBuffer2);判断纬度格式函数;
bool VeriDayForm(char*szBuffer2);判断日期格式函数;
如果语句为正确的GPRMC语句,接下来就可以提取所需信息,提取时间、经纬度和日期信息的部分程序如下:
void PrintTime(char*szBuffer2);打印时间函数,在此要将UTC时间转换为北京时间;
void PrintLonLat (char*szBuffer2,int n);打印经纬度函数;
void PrintDay (char*szBuffer2);打印日期函数,以年/月/日形式打印。
3 结束语
全球定位系统具有性能好、精度高、应用广等特点,是迄今最好的导航定位系统。随着全球定位系统的不断改进,以及硬件和软件的不断完善,其应用领域还在不断地开拓。目前,GPS应用已开始逐步深入人们的日常生活。GARMIN的GPS接收机功耗非常小,数据更新很快,而且,其优良的性能既能满足陆地导航的灵敏度要求,也能满足飞行器的动态要求。