用于 GPS 通信的原生 DLL






4.25/5 (8投票s)
在受限环境中,完全控制与 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 月。