/*包含必要的头文件*/
#include
#include
#include
#include
#include
#include
#include
int GPS_Initial(int n_tty_no)
{
int ret_tty=-1;
int ret_thread=-1;
ret_tty=OpenComPort(n_tty_no,9600,8,“1”,‘N’);/*打开串口,并设置通信属性,如波特率,数据位,有无奇偶校验,停止位等*/
ret_thread=pthread_create(&pthr_id,NULL,GPS_
Thread_Port_Svc,NULL);/*创建接收线程*/
…
}
void*GPS_Thread_Port_Svc(void*pData)
{/*接收线程函数*/
unsigned char buf_GPS[256];
int ret_rd_com;
while(1) {
bzero(buf_GPS,sizeof(buf_GPS));
ret_rd_com=ReadComPort((void*)buf_GPS,
sizeof(buf_GPS));/*读串口,接收数据*/
GPS_Parse_Data(buf_GPS,&gps_data);
/*调用解析语句函数,*/
…}
在GPS_Parse_Data(buf_GPS,&gps_data)函数中每接收一个GPS语句,调用一次字符串解析函数。
GPS_Parse_Data_Line(char*str_gprs_data_line,GPS_DATA_TYPE*GPS_DATA){
char*temptr;
temptr=str_gprs_data_line;
/*字符串赋给临时指针,然后对其解析*/
if(strncmp(temptr,RMC_DATA_L,strlen(RMC_DATA_L))==0) {/*解析RMC语句串*/
startchar(temptr,',');
temptr=temptr+strlen(temptr)+12;
/*$GPRMC,HHMMSS.SSS*/
GPS_DATA->Time.Flag=temptr[0];
temptr=temptr+27;
/*A,DDMM.MMMM,N,DDDMM.MMMM,E*/
…}
以上只是GPS信息处理的部分代码。经过交叉编译调试下载至目标平台上,运行后可得到本地地理位置信息。实验所得数据为:时间10:28:35;纬度:北纬30°46’;经度:东经103°57’。用户也可以根据需要选择提取GPS的其他语句,只需编写解析相应语句字符串的代码即可。4.2 GPS坐标的转换
上述所得的结果属于WGS84坐标,而在工程上实用的大多是国家坐标系,因此GPS数据采集结果的使用就存在与国家坐标系间的坐标转换问题。一般要通过两步转换:首先将上述实测经纬度坐标即WGS84大地坐标(L,B)转换为对应于WGS84椭球的高斯平面坐标(X84,Y84),然后再经过平面坐标转换,将高斯平面坐标(X84,Y84)强制附合到本地高斯平面坐标系统[4]。
(1)高斯投影换算
将GPS采集所得出的大地坐标(L,B)转换为高斯平面坐标(X84,Y84)。有关的推导过程较复杂,本文只给出结果:
由上述原理利用EXCEL就可以算出对应的高斯平面坐标。
(2)平面坐标转换
平面坐标转换的目的就是将高斯投影换算得出平面坐标(X84,Y84)转换为当地国家坐标系的平面坐标。下面介绍一种平均转轴相似转换法,以转换为北京54坐标系下的平面坐标(X54,Y54)为例,说明该方法实现过程。
首先,根据公共点分别在WGS84和北京54系中的高斯平面坐标,求出该点在两个坐标系中同一边的方位角之差?驻?琢和长度比例系数?资,然后按下式计算任一点在北京54系中的平面坐标。
将得到的X54,Y54坐标可应用于GIS系统标图,实现导航定位。
。基于NMEA-0183通信协议,在Linux下通过多线程编程实现了GPS基本定位信息的采集与处理,所得数据满足精度要求,为导航定位系统或GIS系统提供了数据基础。