代码之家  ›  专栏  ›  技术社区  ›  Jeff

从.NET WinForm应用程序访问GPS数据

  •  3
  • Jeff  · 技术社区  · 16 年前

    有没有人有过从连接到移动PC的GPS上通过程序检索lat/long的经验?我所在的一个团队目前正在研究硬件选项——作为一名程序员,他最终将不得不接受任何被选中的项目。我想知道,是否有人有写与GPS接口的.NET程序的经验?对于硬件和/或编程的任何建议都将非常感谢。

    正如我想象的那样,我的应用程序需要向GPS询问当前的纬度/经度,可能每10到20秒询问一次。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Luke Schafer    16 年前

    我以前写过这样的申请书。

    正如亨克所说,你听的是一个COM端口。构建一个组件来读取COM流,比如说1024缓冲区。这将足以包含至少一个完整的NMEA句子。从那里,读取输入,直到找到一个句子的开头并解析它。如果由于某种原因您没有完整的句子,请在另一个缓冲区中读取,追加并继续/重试。

        2
  •  1
  •   Eric Brown    16 年前

    如果你愿意依赖Windows7,有一个 Location API 它为您处理NMEA解码。

        3
  •  1
  •   Roubachof    16 年前

    如果GPS集成在Windows CE PC或Windows移动电话中,您只需使用GPS中间驱动程序来收集信息。 因为您在.NET环境中,所以可以创建此本机API的.NET包装器。

    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);
    
        ...
    }
    

    当然,您必须处理编组和所有伟大的互操作事务:)