65.9K
CodeProject 正在变化。 阅读更多。
Home

用于 GPS 通信的原生 DLL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (8投票s)

2010 年 6 月 15 日

CPOL

2分钟阅读

viewsIcon

65440

downloadIcon

3284

在受限环境中,完全控制与 GPS 设备的通信。

引言

.NET Framework 提供了用于与端口通信的便捷函数,例如读取 GPS 数据所需的 COM 端口。这在 CodeProject 上的其他文章中已有描述。

虽然这些函数也可在 Compact Framework 中使用,但由于设备上安装的 Compact Framework 的限制,在许多设备上,简单地使用正确的 COM 端口打开流来监听 GPS 数据并不能正常工作。

本文描述了一个用 C++ 编写的 DLL,它提供了对 COM 端口通信的完全控制。它导出了用于打开、配置和关闭端口的函数,以及逐个字符地从端口读取信息的功能。

背景

在开发我的 Maplorer 应用程序 (www.maplorer.com) 时,我发现通信只能在本地应用程序中工作,并且只能用于大小为单个字符的缓冲区。原则上,读取 GPS 数据非常简单,因为 GPS 设备会不断地将所有读数发送到(设备特定的)COM 端口,形成一个永无止境的字符串。你所需要做的就是监听该端口,并使用 NMEA 语法解析该字符串。由于我的设备上不可用 .NET 功能,我开发了一个 DLL 来提供它。

Using the Code

DLL 中包含的函数可以通过 DllImport 语句在任何 .NET 应用程序中非常容易地使用;例如,要在你的任何类中使用该函数,只需添加

class MyClass 
{
    [DllImport("GpsDll.dll")]
    public static extern int InitGpsCom(int Port, int BaudRate, 
                  int ByteSize, int StopBits, int Parity);

    [DllImport("GpsDll.dll")]
    public static extern char ReadNextChar();

    [DllImport("GpsDll.dll")]
    public static extern int CloseGpsCom();
    ...
}

列出的三个函数用于打开通信 (InitGpsCom)、读取下一个字符 (ReadNextChar) 和释放端口。

ReadNextChar 函数可以很容易地用于读取 NMEA 句子,因为每个新句子都以 '$' 符号开头;例如,在 C# 中,你可以这样写

public String ReadNextSentence()
{
    String result = "";
    char c;

    while ((c = ReadNextChar()) != '$')
        result += c;
    
    result = "$" + result;

    return result;
}

GpsDllSample.zip 提供了一个完整的示例,说明如何在 C# 中使用 DLL,包括一个 NMEA 类来解析 NMEA 句子并确定纬度、经度、方位等。

关注点

这个项目主要向你展示,你总是可以自行控制设备:如果你的编程环境中没有可用的功能,你通常可以在更深一层找到它!

此解决方案的缺点是它将你的应用程序限制为编译 DLL 的 CPU 架构 - 你现在运行的是本地代码,而不仅仅是 .NET 字节码。

历史

  • 版本 1.0:2010 年 2 月。
© . All rights reserved.