技术开发 频道

巧用GPSID驱动 快速实现WinCE GPS开发

  同时,GPSID 还实现了另外的两个好处:一是多个应用程序可以同时访问同一个 GPS 设备,因为访问的是 GPSID,而仅仅把GPSID当作虚机硬件克隆,避免了对串口重叠操作的等候弊端。二是GPSID最大的好处是可以帮助解析NMEA语法,这样可以用非常简单的应用程序接口就得到GPS位置信息了。而且,GPSID 的所有设置信息都保存在注册表中,可以通过修改注册表来更改 GPSID 的设置。

  例如,可以让 GPSID 从一个包含 NMEA 命令的 .txt 文件读取 GPS 数据,而不需要再从 GPS 设备中读取数据。因此,应用GPSID函数库后既可以访问解析后的GPS数据,也可以访问原始的GPS数据,还可以通过IOCTL函数来控制GPSID的执行以及进行GPS硬件的电源管理。

  3.如何应用GPSID实现WinCE和GPS模块的通信?

  (1)查看GPS设备的工作状态

  在和GPS模块通信之前,我们需要先查询GPS模块的工作状态。例如,可以调用API函数 GPSGetDeviceState来获得GPS设备的工作状态。在这里我建议参考微软在WinCE SDK安装目录下的GPS工程样例。在该Demo的GPS.cs中微软封装了GPS的操作类。比如GPSOpenDevice (),GPSCloseDevice (),GPSConnectDevice (),这些函数都可以很方便的使用。其中,GPSDeviceState.cs是用于取得目前GPS设备的状态信息。GPSPosition.cs是每次GPS数据取得后,都会放入该类。而LocationChangedEventArgs.cs是一旦位置改变,即可取得新的GPSPosition。

  (2)创建GPS事件对象,获取GPS数据

  在调用GPSDeviceState.cs取得目前GPS设备的状态信息后,我们下一步的工作是需要启动一个工作线程,以创建GPS事件对象。具体流程是:先通过调用CreateEvent来创建Handles,然后调用GPSOpenDevice API函数将Handle传入得到GPS设备的Handle。得到GPS设备的Handle之后,可再创建一个线程来监听GPS数据及设备状态。然后,再通过调用CreateGpsEventThread方法来创建线程。

  例如,当GPS设备的状态改变时,就可以调用DeviceStateChanged事件取得当前设备的状态。当GPS设备的位置改变时,就可以调用LocationChanged事件取得当前的坐标。然后,再使用WaitForSingleObject()函数或WaitForMultipleObjects()函数来处理事件通知。最后,通过重复调用DeviceStateChanged事件、LocationChanged事件、WaitForSingleObject()函数或WaitForMultipleObjects()函数,和调用GPSGetPosition()以获取完整的GPS信息。这样一个基本的获取GPS数据的过程就完成了。

  (3)应用程序的相应处理

  在获取GPS事件的线程中,不断的通过GPSID中间驱动层就能从串口读入数据,然后分析就能得到定位信息、卫星状态和定位误差,再通过回调函数指针将这些信息送回主线程就可以实现应用程序的相应处理了。最后,可调用GPSCloseDevice()函数关闭设备,以节省GPS接收模块的电源管理。

  在本次项目的调试中,因为经常会出现整个程序陷入缓慢的等待情况。所以,我们在WinCE 下的GPS编程时,除了采用单独的线程来处理读写串口操作外,还采用了利用通信事件的方法。通信事件就是当发生重要事件时,WinCE可以向应用程序发送的通知,这样就可以大大的提高GPS的响应速度,避免让用户陷入不知所措的长久等待之中。

1
相关文章