首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从序列中解析NMEA语句

从序列中解析NMEA语句
EN

Stack Overflow用户
提问于 2016-10-23 13:14:12
回答 1查看 5.9K关注 0票数 0

我想使用Arduino上的TinyGPS++来解析NMEA数据,并在OLED显示器上显示信息。但是,NMEA数据将被USB接收,而不是使用软件串行和TX/RX引脚。

我学习了TinyGPS++的例子,但遇到了两个问题:

1)当我通过串行监视器(,Arduino 1.6.9)发送一个NMEA语句时,Arduino只接收到前64个字符。我怎样才能克服这个限制呢?我帮自己删除了几位小数,但这不是首选的方法。

2)在TinyGPS++ BasicExample中示例NMEA字符串在只读内存中定义:

代码语言:javascript
复制
// A sample NMEA stream.
const char *gpsStream =
  "$GPRMC,045103.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7C\r\n"
  "$GPGGA,045104.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*62\r\n"
  "$GPRMC,045200.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*77\r\n"
  "$GPGGA,045201.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6C\r\n"
  "$GPRMC,045251.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7D\r\n"
  "$GPGGA,045252.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6F\r\n";

并被

代码语言:javascript
复制
while (*gpsStream) {
  Serial.print(*gpsStream);
  gps.encode(*gpsStream++);
}

我收到我的NMEA (不幸的是只有一行)这样:

代码语言:javascript
复制
if (Serial.available()) {
  while (Serial.available() > 0) {
    if(index < 80)
    {
      inChar = Serial.read();
      inData[index] = inChar;
      index++;
      inData[index] = '\0';
    }
  }
}

并试图通过以下方式解析它:

代码语言:javascript
复制
index = 0;
while (index < 80) {
  gps.encode(inData[index]);
  Serial.print(inData[index]);
  index++;
}

但这并不如人们所愿。检查位置isValid()是否总是返回为不为真。

不幸的是,我有几个可能的来源为这种不想要的行为。

  1. 太短的句子(不太可能)
  2. 不正确的串行读取数据的方式。
  3. 我只提交一行。
  4. 一些其他的东西。

我对NMEA和串行数据通信都不是很有经验,而且我对Arduino/C的经验也很少。你能告诉我如何解决这些问题吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-23 20:49:37

基本上,您不需要积累NMEA字符。当你收到它们的时候,就把它们送到GPS库去。您不提供整个循环,但是在那里出现问题也是非常常见的。

在与几个GPS库和它们的示例进行了斗争之后,我最终编写了NeoGPS。它比所有其他库更快、更小,它验证校验和,并且示例结构正确。与其他库不同,NeoGPS不将GPS值存储为浮点值,因此它能够保持GPS设备的全部精度。

如果您想试一试,请务必按照安装说明执行。NMEA.ino示例将为您发送的每一批GPS语句发出一行信息(CSV格式),以默认的RMC语句结束。一定要修改它以使用Serial对象而不是gps_port,或者简单地这样定义它:

代码语言:javascript
复制
  #define gps_port Serial

它还将显示已被解析的字符数、收到了多少好的句子以及有多少个句子有校验和错误。如果没有正确生成校验和,这将有助于调试。本站也很有用。

这些CSV行将通过USB端口(到PC)发送回,但您可以轻松地将其更改为将特定字段发送到OLED (请参见NMEAloc.ino)。

虽然可以在PC上开发一些东西,然后将其移植到像Arduino这样的嵌入式环境中,但您必须注意(1)线性规划结构,(2)忽略资源限制(程序大小、MCU速度和RAM)。Arduino环境中有许多奇怪之处,这通常会使将“草图”移植到或从PC上移植令人沮丧。主要用途:P

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40203339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档