带GPS功能的Windows Mobile手机定位可以通过GPS获取手机所在的详细地址,民用一般误差在5米到50米之间的范围内。通过使用GPSApi头文件中包含的一下四个函数,由GPS中层驱动程序(GPSID)提供,可以通过它使用GPS设备并实时更新手机所在位置的信息。注意包含GPSAPI.h头文件与GPAAPI.lib静态链接库。(在做gps方面开始时可以参照sdk的几个Demo)
GPSOpenDevice
GPSGetPosition
GPSGetDeviceState
GPSCloseDevice
一、下面分别介绍各个函数的功能,参数以及具体怎样实现使用这些函数。
1.GPS_POSITION结构
在介绍各个函数之前,要先介绍GPS_POSITION数据结构,他用来存放GPS定位所需要的各种信息。
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->typedefstruct_GPS_POSITION{
DWORDdwVersion;//GPSID的版本号,在调用GPSGetPosition之前赋值,暂时必须被赋值为GPS_VERSION_1
DWORDdwSize;//GPS_POSITION结构的大小,同样应先用sizeof给它赋值
DWORDdwValidFields;//结构实例中的有效空间标记,标记结构中哪些值有效
DWORDdwFlags;//在调用GPSGetPosition函数时修改过的数据的状态
SYSTEMTIMEstUTCTime;//根据GPS卫星提供的信息获得的宇宙时间
doubledblLatitude;//纬度,单位”度”,正数表示北
doubledblLongitude;//经度,单位”度”,正数表示东
floatflSpeed;//移动速度,单位“KNOTS”(海里),估计是海里/小时
floatflHeading;//移动方向,单位“度”,数值为偏北往顺时针的度数
doubledblMagneticVariation;//正北与地磁北极角度差,整数表示往东的度数
floatflAltitudeWRTSeaLevel;//距海平面高度
floatflAltitudeWRTEllipsoid;//距椭球面高度
GPS_FIX_QUALITYFixQuality;
GPS_FIX_TYPEFixType;
GPS_FIX_SELECTIONSelectionType;
floatflPositionDilutionOfPrecision;
floatflHorizontalDilutionOfPrecision;
floatflVerticalDilutionOfPrecision;
DWORDdwSatelliteCount;//获取以上信息使用到的卫星数量
DWORDrgdwSatellitesUsedPRNs[GPS_MAX_SATELLITES];
DWORDdwSatellitesInView;//GPS硬件设备可见范围内的卫星数量
DWORDrgdwSatellitesInViewPRNs[GPS_MAX_SATELLITES];
DWORDrgdwSatellitesInViewElevation[GPS_MAX_SATELLITES];
DWORDrgdwSatellitesInViewAzimuth[GPS_MAX_SATELLITES];
DWORDrgdwSatellitesInViewSignalToNoiseRatio[GPS_MAX_SATELLITES];
}GPS_POSITION,*PGPS_POSITION;
DWORDdwVersion;//GPSID的版本号,在调用GPSGetPosition之前赋值,暂时必须被赋值为GPS_VERSION_1
DWORDdwSize;//GPS_POSITION结构的大小,同样应先用sizeof给它赋值
DWORDdwValidFields;//结构实例中的有效空间标记,标记结构中哪些值有效
DWORDdwFlags;//在调用GPSGetPosition函数时修改过的数据的状态
SYSTEMTIMEstUTCTime;//根据GPS卫星提供的信息获得的宇宙时间
doubledblLatitude;//纬度,单位”度”,正数表示北
doubledblLongitude;//经度,单位”度”,正数表示东
floatflSpeed;//移动速度,单位“KNOTS”(海里),估计是海里/小时
floatflHeading;//移动方向,单位“度”,数值为偏北往顺时针的度数
doubledblMagneticVariation;//正北与地磁北极角度差,整数表示往东的度数
floatflAltitudeWRTSeaLevel;//距海平面高度
floatflAltitudeWRTEllipsoid;//距椭球面高度
GPS_FIX_QUALITYFixQuality;
GPS_FIX_TYPEFixType;
GPS_FIX_SELECTIONSelectionType;
floatflPositionDilutionOfPrecision;
floatflHorizontalDilutionOfPrecision;
floatflVerticalDilutionOfPrecision;
DWORDdwSatelliteCount;//获取以上信息使用到的卫星数量
DWORDrgdwSatellitesUsedPRNs[GPS_MAX_SATELLITES];
DWORDdwSatellitesInView;//GPS硬件设备可见范围内的卫星数量
DWORDrgdwSatellitesInViewPRNs[GPS_MAX_SATELLITES];
DWORDrgdwSatellitesInViewElevation[GPS_MAX_SATELLITES];
DWORDrgdwSatellitesInViewAzimuth[GPS_MAX_SATELLITES];
DWORDrgdwSatellitesInViewSignalToNoiseRatio[GPS_MAX_SATELLITES];
}GPS_POSITION,*PGPS_POSITION;
2.GpsOpenDevice
函数原型如下:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->HANDLEGPSOpenDevice(
HANDLEhNewLocationData,
HANDLEhDeviceStateChange,
constWCHAR*szDeviceName,
DWORDdwFlags
);
HANDLEhNewLocationData,
HANDLEhDeviceStateChange,
constWCHAR*szDeviceName,
DWORDdwFlags
);
前两个参数为HANDLE型,都通过CreateEvent的返回值给它们赋值。如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->HANDLEs_hNewLocationData=CreateEvent(NULL,FALSE,FALSE,NULL);
HANDLEs_hDeviceStateChange=CreateEvent(NULL,FALSE,FALSE,NULL);
HANDLEs_hDeviceStateChange=CreateEvent(NULL,FALSE,FALSE,NULL);
第2个参数: HANDLE hDeviceStateChange CreateEvent生成的句柄或者为NULL。当GPS设备位置发生改变时,驱动将其设置为信号态。
第3个参数:必须为NULL。
第4个参数:必须为0。
返回值:成功则返回GPS中间驱动句柄。失败则为NULL。
3.GPSGetPosition
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->DWORDGPSGetPosition(
HANDLEhGPSDevice,
GPS_POSITION*pGPSPosition,
DWORDdwMaximumAge,
DWORDdwFlags
);
HANDLEhGPSDevice,
GPS_POSITION*pGPSPosition,
DWORDdwMaximumAge,
DWORDdwFlags
);
函数功能:返回本地位置信息。
第1个参数:HANDLE hGPSDevice GPS设备句柄。GPSOpenDevice函数打开的设备句柄。这个参数可以为NULL,此时函数不会启动GPS设备。但函数会返回其他程序调用GPS驱动后保留的数据。这个数据满足dwMaximumAge设置的时间值。第2个参数:GPS_POSITION *pGPSPosition GPS_POSITION结构指针。函数将填充这个结构。用户必须输入结构版本和大小参数值。
第3个参数:DWORD dwMaximumAge规定了本地GPS信息的最长有效期。在有效期内可以使用这个数据。
第4个参数: DWORD dwFlags 保留值为0。返回值:成功:ERROR_SUCCESS。失败:错误信息。
GPSGetDeviceState
DWORD GPSGetDeviceState(
GPS_DEVICE *pGPSDevice
);
函数功能:获取GPS硬件设备的当前状态信息。
参数:GPS_DEVICE *pGPSDevice :GPS_DEVICE结构体指针。
返回值:成功:ERROR_SUCCESS。错误:错误编号。
4.GPSCloseDevice
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->DWORDGPSCloseDevice(
HANDLEhGPSDevice
);
HANDLEhGPSDevice
);
参数:HANDLE hGPSDevice:GPSOpenDevice打开的GPS设备句柄。
返回值:成功:ERROR_SUCCESS。错误:错误信息。
二、GPS具体实现细节
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->1>首先用CreateEvent生成3个接受消息的句柄,两个上述以说明,第三个用来接受置关闭GPS设备结束线程
HANDLEs_hExitThread=CreateEvent(NULL,FALSE,FALSE,NULL);
2>打开GPS设备并声明线程函数
HANDLEs_hGPS_Device=GPSOpenDevice(s_hNewLocationData,s_hDeviceStateChange,NULL,NULL);
DWORDGPSThreadProc(__optLPVOIDlpParameter);
3>定义线程函数
DWORDGPSThreadProc(__optLPVOIDlpParameter)
{
GPS_POSITIONgps_Position={0};//不用说了,放数据的
DWORDdwRet=0;//表状态的,具体状态干具体的事
GPS_DEVICEgps_Device={0};//存放GPS设备信息,在GPSGetDeviceState前要赋值,如下
HANDLEgpsHandles[GPS_CONTROLLER_EVENT_COUNT]={s_hNewLocationData,s_hDeviceStateChange,s_hExitThread};
gps_Position.dwSize=sizeof(gps_Position);//POSITION结构的第一个参数
gps_Position.dwVersion=GPS_VERSION_1;//POSITION结构的第二个参数
gps_Device.dwVersion=GPS_VERSION_1;//DEVICE结构的第二个参数
gps_Device.dwSize=sizeof(gps_Device);//DEVICE结构的第一个参数
while(1)//循环获取
{
dwRet=WaitForMultipleObjects(GPS_CONTROLLER_EVENT_COUNT,gpsHandles,FALSE,100);
switch(dwRet)
{
caseWAIT_OBJECT_0://有数据,获取并输出
dwRet=GPSGetPosition(s_hGPS_Device,&gps_Position,MAX_AGE,0);
break;
caseWAIT_OBJECT_0+1://设备状态变化,获取状态信息
dwRet=GPSGetDeviceState(&gps_Device);
ZeroMemory(&gps_Device,sizeof(gps_Device));
gps_Device.dwVersion=GPS_VERSION_1;
if(ERROR_SUCCESS==dwRet)
{//状态获取成功,则获取定位信息
dwRet=GPSGetPosition(s_hGPS_Device,&gps_Position,MAX_AGE,0);}
break;
caseWAIT_OBJECT_0+2://结束线程事件,关闭GPS设备
GPSCloseDevice(s_hGPS_Device);
return1;
default:
break;
}
//获取间断时间
Sleep(MAX_WAIT);
}
return0;
}
4>_tmain函数
int_tmain(intargc,_TCHAR*argv[])
{
DWORDm_dwThreadID;//创建线程
HANDLEm_hThread=CreateThread(NULL,NULL,GPSThreadProc,NULL,NULL,&m_dwThreadID);
GPSThreadProc(NULL);//运行线程
return0;
}
HANDLEs_hExitThread=CreateEvent(NULL,FALSE,FALSE,NULL);
2>打开GPS设备并声明线程函数
HANDLEs_hGPS_Device=GPSOpenDevice(s_hNewLocationData,s_hDeviceStateChange,NULL,NULL);
DWORDGPSThreadProc(__optLPVOIDlpParameter);
3>定义线程函数
DWORDGPSThreadProc(__optLPVOIDlpParameter)
{
GPS_POSITIONgps_Position={0};//不用说了,放数据的
DWORDdwRet=0;//表状态的,具体状态干具体的事
GPS_DEVICEgps_Device={0};//存放GPS设备信息,在GPSGetDeviceState前要赋值,如下
HANDLEgpsHandles[GPS_CONTROLLER_EVENT_COUNT]={s_hNewLocationData,s_hDeviceStateChange,s_hExitThread};
gps_Position.dwSize=sizeof(gps_Position);//POSITION结构的第一个参数
gps_Position.dwVersion=GPS_VERSION_1;//POSITION结构的第二个参数
gps_Device.dwVersion=GPS_VERSION_1;//DEVICE结构的第二个参数
gps_Device.dwSize=sizeof(gps_Device);//DEVICE结构的第一个参数
while(1)//循环获取
{
dwRet=WaitForMultipleObjects(GPS_CONTROLLER_EVENT_COUNT,gpsHandles,FALSE,100);
switch(dwRet)
{
caseWAIT_OBJECT_0://有数据,获取并输出
dwRet=GPSGetPosition(s_hGPS_Device,&gps_Position,MAX_AGE,0);
break;
caseWAIT_OBJECT_0+1://设备状态变化,获取状态信息
dwRet=GPSGetDeviceState(&gps_Device);
ZeroMemory(&gps_Device,sizeof(gps_Device));
gps_Device.dwVersion=GPS_VERSION_1;
if(ERROR_SUCCESS==dwRet)
{//状态获取成功,则获取定位信息
dwRet=GPSGetPosition(s_hGPS_Device,&gps_Position,MAX_AGE,0);}
break;
caseWAIT_OBJECT_0+2://结束线程事件,关闭GPS设备
GPSCloseDevice(s_hGPS_Device);
return1;
default:
break;
}
//获取间断时间
Sleep(MAX_WAIT);
}
return0;
}
4>_tmain函数
int_tmain(intargc,_TCHAR*argv[])
{
DWORDm_dwThreadID;//创建线程
HANDLEm_hThread=CreateThread(NULL,NULL,GPSThreadProc,NULL,NULL,&m_dwThreadID);
GPSThreadProc(NULL);//运行线程
return0;
}
相关推荐
WM8960数据手册 WM8960是一款低功率、高质量的立体声Codec,专门设计用于便携式数字音频应用。它具有高质量的音频转换和强大的speaker driver,能够提供1W每通道的输出功率,适用于便携式音频设备。 Codec是音频...
这可能包括设置定位参数、初始化序列、接收和解析GPS数据,以及错误排查步骤。对于初学者来说,使用手册提供了逐步操作指南,使他们能够快速上手。 开发文档则是为软件开发者准备的,它详细阐述了模块的API接口、...
**WM8731 数据手册详解** WM8731 是一种高性能的立体声音频编解码器,广泛应用于便携式音频设备、移动电话、MP3 播放器和其他消费类电子产品中。该芯片集成了模拟和数字音频处理功能,提供高质量的音频输出,同时...
此外,考虑到代码的可重用性和研究价值,这个项目可能还包含了模块化的设计,例如将GPS接口操作、数据解析、位置更新处理等逻辑封装成独立的类或函数,方便在其他项目中复用。 总的来说,基于WM6的GPS开发是一个...
### WM8960 数据手册解析 #### 一、概述 **WM8960** 是一款专为便携式数字音频应用设计的低功耗、高品质立体声编解码器(CODEC)。该器件集成了立体声 Class D 扬声器驱动器和耳机驱动器,特别适用于移动设备中的...
在成功打开设备后,创建一个单独的线程来监听GPS数据和设备状态变化,这可以通过`CreateGpsEventThread`方法实现。在这个线程中,程序会持续接收来自GPS设备的数据,解析NMEA数据,获取经纬度坐标,以及进行必要的...
wm windows mobile agps a-gps 辅助gps 的a-gps 工具
在SAP系统中,PP(Production Planning)和WM(Warehouse Management)模块的接口配置与主数据设置对于实现高效的生产流程至关重要。本操作手册提供了一套详细的步骤,旨在帮助用户理解和实施这一过程。以下是对相关...
WM_COPYDATA消息是一种轻量级的IPC方式,它允许一个进程向另一个进程传递数据,而无需创建额外的共享对象或管道。本篇文章将深入探讨WM_COPYDATA在数据传输中的性能表现,主要包括CPU利用率、服务器发送时间、客户端...
标题中的“GPS控制器用于Mobile开发WM5.0”指的是在Windows Mobile 5.0操作系统上进行GPS(全球定位系统)应用开发的一种控制器或组件。Windows Mobile是微软为智能手机和平板电脑设计的操作系统,版本5.0是其早期的...
在Windows编程中,WM_GETTEXT消息是用于从窗口或控件获取文本的一种机制。这个例子是关于如何利用WM_GETEXT(可能是指WM_GETTEXT的误写)来获取控件信息的具体应用。通常,WM_GETTEXT消息可以用于获取窗口标题、按钮...
这样他们可以利用这个驱动来获取GPS数据,构建定位、导航或者其他与地理位置相关的应用程序。 标签“GPSID”和“GPS”直接关联了主题的关键技术。GPSID是与GPS硬件交互的软件层,它负责将接收到的卫星信号转换成...
wm8731驱动,带中文和英文官方数据手册。
提供的STM32例程示例了如何通过STM32与WM8978进行通信,实现音频数据的传输和控制。这包括了初始化配置、寄存器设置、中断处理等关键代码,对于熟悉STM32的开发者来说,可以快速上手WM8978的应用开发。 总结,这个...
在参考电路方面,WM8974/WM8978的数据手册提供了一个经过验证的音频参考电路,这个电路可以用于支持上述特性的实际应用。电路设计者可以根据这个参考电路对芯片进行适当的外围电路配置和信号调理,以便在产品设计中...
### WM8741 数据手册知识点解析 #### 一、WM8741 概述 **WM8741** 是一款专为高级音频应用而设计的高性能立体声数模转换器(Digital-to-Analog Converter, DAC)。这类应用包括但不限于专业录音系统、A/V接收器、...
9. **错误和非音频数据检测**:WM8805能检测非音频数据,识别采样率变化,并执行去加重处理,增强了数据的准确性和完整性。 10. **可编程功能**:寄存器控制的通道状态位配置和错误标志的读回功能,允许用户自定义...
WM8960硬件数据手册,发的是网盘链接,若链接失效可留言或私信提醒我更新链接
1. **高分辨率音频**:WM8960支持24位音频数据,采样率高达96kHz,确保了高质量的音频输出。 2. **集成模拟和数字电路**:芯片内部集成了模拟功放、数字信号处理器(DSP)、模拟至数字转换器(ADC)和数字至模拟转换器...
由于"WM8974谷歌WM8974中文资料"是经过谷歌翻译的版本,可能存在翻译不准确的情况,因此建议用户在深入研究时,同时参考官方英文文档以获取最准确的信息。"WM8974.html"可能是该芯片的数据手册或应用笔记,而"WM8974...