【问题标题】:AVR code for converting GPS coordinates to NMEA format用于将 GPS 坐标转换为 NMEA 格式的 AVR 代码
【发布时间】:2014-04-11 01:05:49
【问题描述】:

我制作了一个从 GPS 获取数据并发送的 Android 应用程序。它被 aPC 接收,并通过 USB 发送到 AVR 套件,该套件需要将经度、纬度格式转换为 NMEA 格式并返回到 USB。消息格式为:

latitude='23.353434333' 和 longitude='45.34333345'

我需要使用 ATmega32 将上述消息转换为 NMEA GPS 格式,但由于我不了解 AVR 编程,有人可以建议我如何做到这一点或上面的代码吗?

【问题讨论】:

  • 这不是一个“为我编写代码”论坛,而是一个针对您正在编写的代码提出具体的、经过充分研究的编码问题的地方。

标签: c++ c gps avr nmea


【解决方案1】:

您没有 AVR 编程经验与实施 NMEA 无关。然而,了解 C 语言会有所帮助;)

您给定的表示 latitude='23.353434333' 和 longitude='45.34333345' 称为十进制度数(您的示例缺少 N/S 和 E/W 指示) .

我假设您知道 NMEA 是一种协议规范,而不仅仅是一种坐标格式。 NMEA 标准在数据集中使用以下坐标表示法:

XXYY.ZZZZ

这可以直接用 度分秒 格式表示,如下所示:

XX°YY'(0.ZZZZ * 60)"

所以两者之间的转换是微不足道的,以及从度分秒十进制度度的转换:

十进制度 = 度 + 分/60 + 秒/3600

因此,本质上,您只需反向执行给定的转换,即可获得 NMEA 坐标格式。

NMEA 数据集如下所示:

$GPRMC,162614,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13

我用粗体突出了坐标信息。实现转换并没有什么特别之处,而实现 NMEA 协议需要额外阅读一些关于实现细节的信息。

【讨论】:

  • 如果您对微控制器/AVR 编程完全不熟悉,您可能必须先学习基础知识。由于您“制作了一个 android 应用程序”,我假设您至少具有基本的编码技能。如果是这样的话,实现上面提到的坐标变换应该不难。您必须从这里独自前往或提出单独的问题;)
【解决方案2】:

将 NMEA 十进制度值转换为度/分/秒 第一的。将十进制值转换为十进制: 5144.3855 (ddmm.mmmm) = 51 44.3855 = 51 + 44.3855/60 = 51.7397583 度

然后将十进制转换为度,分秒: 51 度 + .7397583 * 60 = 44.385498 = 44 分钟 .385498 = 23.1 秒 结果:51 44' 23.1"

【讨论】:

  • private String decimalToDMS(double value) { String result = null;双度值 = 值 / 100; int 度 = (int) degValue;双 decMinutesSeconds = ((degValue - 度)) / .60;双分钟值 = decMinutesSeconds * 60; int 分钟 = (int) 分钟值;双 secsValue = (minuteValue - 分钟) * 60;结果 = 度数 + "\u00B0" + " " + 分钟 + "' " + String.format("%.1f", secsValue) + "\" "; 返回结果; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多