views:

395

answers:

4

Does anyone out there have any experience programatically retreiving the lat/long from a GPS attached to a mobile PC? A team I'm on is currently looking at hardware options--as the programmer who will eventually have to live with whatever is selected I was wondering if anyone out there has had experience writing .Net programs that interface with a GPS? Any recomendations for hardware and/or programming would be greatly appreciated.

As I envision it, my application will need to ask the GPS for the current lat/long perhaps once every 10 to 20 seconds.

+1  A: 

I've written such an application before.

As Henk said, you listen on a COM port. Build a component that reads the com stream in, in say a 1024 buffer. that'll be plenty to contain at least 1 complete NMEA sentence. From there, read the input until you find the start of a sentence and parse it. If for some reason you don't have the full sentence, read in another buffer, append and continue/try again.

Luke Schafer
Although NMEA is plain ASCII I would still recommend attaching a TextReader to the Serialport's stream and use ReadLine().
Henk Holterman
+1  A: 

If you're willing to be dependent on Windows 7, there's a Location API that handles the NMEA decoding for you.

Eric Brown
+1  A: 

See this article: http://www.codeproject.com/KB/mobile/LocationAwarePhoneBook.aspx

unclepaul84
+1  A: 

If the Gps is integrated within your windows CE PC or windows mobile phone, you can simply use the GPS Intermediate Driver to pool for information. Since you are in a .net environment, you could create a .Net wrapper to this native API.

public class GpsHardware
{
    private const string gpsLibraryName = "gpsapi.dll";
    private const string coreLibraryName = "coredll.dll";

    [DllImport(GpsHardware.coreLibraryName, SetLastError = false)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool EventModify(IntPtr hEvent, uint function);

    [DllImport(GpsHardware.gpsLibraryName, SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern IntPtr GPSOpenDevice(IntPtr hNewLocationData, IntPtr hDeviceStateChange, string szDeviceName, uint dwFlags);

    [DllImport(GpsHardware.gpsLibraryName, SetLastError = true)]
    private static extern uint GPSCloseDevice(IntPtr hGPSDevice);

    [DllImport(GpsHardware.gpsLibraryName, SetLastError = true)]
    private static extern uint GPSGetPosition(IntPtr hGPSDevice, IntPtr pGPSPosition, uint dwMaximumAge, uint dwFlags);

    [DllImport(GpsHardware.gpsLibraryName, SetLastError = true)]
    private static extern uint GPSGetDeviceState(IntPtr pGPSDevice);

    ...
}

Of course you will have to deal with marshaling and all the great interop things :)

Roubachof
Or you could use the Interop wrapper in the SDK\\Samples fiolder.
Henk Holterman