c++ - arduino fio v3,GPS NMEA读取错误,疯狂输出

标签 c++ c arduino gps

您好,我有一个在 NMEA 中传输的 GP20U7 GPS。我目前正在一个字符一个字符地阅读。但它似乎给了我两个有点合理的 NMEA 格式的字符串,然后就变得愚蠢了,有什么帮助吗?

下面附有我的所有代码。我也在外面,所以我不应该有任何连接错误。我也等待了两分钟多的连接,但它仍然输出同样的困惑。

下面还显示了我的串行监视器中的字符输出。

<小时/>

$GPRMC,233720.00,V,,,,,,,251016,,,N*7B

$GPVTG,,,,-≠ÉJi‚j

$GP$4$G$G6$G$GP$G

$G$GG$G$G$$G$GP$G0$G$A*$G$G,$G0$T$G7$1$G,$R$G,$GÒ,$G

$6$G5$1$G,$1$G7$7$G,$G$G,$G$G,$GA$1$G3$

#include <XBee.h>
#include <Wire.h>
#include <SparkFunMPL3115A2.h>
#include <SPI.h>
#include <SparkFunLSM9DS1.h>
#include <SoftwareSerial.h> //XBEE Comms
#include <SD.h>

SoftwareSerial XBee(0, 1); // RX, TX (0 and 1 are the TX/RX pins 
SoftwareSerial gps(9, 10);

MPL3115A2 altimeter;
LSM9DS1 accelerometer;

#define LSM9DS1_M 0x1E //I2C addresses of the LSM9DS1
#define LSM9DS1_AG 0x6B
#define PRINT_CALCULATED

const int chipSelect = 10;

void setup()
{
  accelerometer.settings.device.commInterface = IMU_MODE_I2C;
  accelerometer.settings.device.mAddress = LSM9DS1_M;
  accelerometer.settings.device.agAddress = LSM9DS1_AG;

  gps.begin(9600);
  XBee.begin(9600);  
  accelerometer.begin();
  altimeter.begin();

  altimeter.setModeAltimeter();
  altimeter.setOversampleRate(7);
  altimeter.enableEventFlags();

  XBee.println("start");
}


void loop() 
{
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    char rc;

    if(gps.available())
    {
      rc = gps.read();
      Serial.print(rc);

    }
    else
    {
      Serial.println("NOT Available");
    }

    float altitude = altimeter.readAltitudeFt();
    float temperature = altimeter.readTempF();

    XBee.println("Altitude");
    XBee.println(altitude);
    XBee.println("Temperature");
    XBee.println(temperature);
    XBee.println("Next"); 

    delay(100);
    dataFile.close();
}

The data looks like it should be correct, but displays weird characters.

After removing the delay this is what my output looks like:

$GPRMC,183714.00,V,,,,,,,,,,N*75 $GPVTG,,,,,,,,,N*30 $GPGGA,1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$ÿGÿPÿRÿMÿCÿ,ÿ1ÿ8ÿ3ÿ7ÿ1ÿ8ÿ.ÿ00ÿÿ,Vÿÿ,,ÿÿ,,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿNÿÿ7ÿ9ÿ $GÿÿPVÿÿTGÿÿ,,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿNÿÿ3ÿ0ÿ $ÿÿGPÿÿGGÿÿA,ÿ1ÿ8ÿ3ÿ7ÿ1ÿ8ÿ.ÿ0ÿ0ÿ,,ÿÿ,,ÿ,ÿ0ÿ,ÿ0ÿ0ÿ,ÿ9ÿ9ÿ.ÿ9ÿ9ÿ,ÿ,ÿ, $ÿGÿPÿGÿSÿAÿ,ÿAÿ,ÿ1ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,,ÿ9ÿ9ÿ.ÿ9ÿ9ÿ,ÿ9ÿ9ÿ.ÿ9ÿ9ÿ,ÿ $ÿGÿPÿGÿLÿLÿ,ÿ,ÿ,ÿ,ÿ,1ÿÿ83ÿÿ71ÿÿ8.ÿ0ÿ0ÿ,ÿVÿ,ÿNÿÿ4ÿEÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$ÿGÿPÿRÿMÿCÿ,ÿ1ÿ8ÿ3ÿ7ÿ1ÿ9ÿ.ÿ0ÿ0,ÿVÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿNÿÿ78ÿÿ $GÿPÿVÿTÿGÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,Nÿÿ*3ÿÿ0 $ÿGÿPÿGÿGÿAÿ,ÿ1ÿ8ÿ3ÿ7ÿ1ÿ9ÿ.0ÿÿ0,ÿÿ,,ÿÿ,,ÿ0ÿ,ÿ0ÿ0ÿ,ÿ9ÿ9ÿ.ÿ9ÿ9ÿ,ÿ,ÿ,$ÿGÿPÿGÿSÿAÿ,ÿAÿ,ÿ1ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,,,ÿ,ÿ,ÿ,ÿ,ÿ9ÿ9ÿ.ÿ9ÿ9ÿ,ÿ9ÿ9.ÿÿ99ÿÿ,9ÿ $GÿÿPGÿÿLLÿ,ÿ,ÿ,ÿ,ÿ,ÿ1ÿ8ÿ3ÿ7ÿ1ÿ9ÿ.ÿ0ÿ0ÿ,Vÿÿ,Nÿÿ*4ÿFÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$ÿÿGPÿÿRMÿCÿ,ÿ1ÿ8ÿ3ÿ7ÿ2ÿ0ÿ.ÿ0ÿ0ÿ,ÿVÿ,ÿ,,ÿÿ,,ÿÿ,,ÿ,ÿ,ÿ,ÿNÿÿ7ÿ2ÿ $ÿGÿPÿVÿTÿGÿ,ÿ,,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿNÿÿ3ÿ0ÿ $ÿGÿPÿGÿGÿAÿ,ÿ1ÿ8ÿ37ÿÿ20ÿ.ÿ0ÿ0ÿ,ÿ,ÿ,ÿ,ÿ,ÿ0ÿ,ÿ0ÿ0ÿ,ÿ9ÿ9ÿ.ÿ99ÿÿ,,ÿÿ,$GÿÿPGÿÿSAÿÿ,Aÿ,ÿ1ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,,ÿÿ,9ÿÿ9.ÿÿ99ÿ,ÿ9ÿ9ÿ.ÿ9ÿ9ÿ,ÿ9 $ÿÿGPÿGÿLÿLÿ,ÿ,ÿ,ÿ,ÿ,ÿ1ÿ8ÿ3ÿ7ÿ2ÿ0ÿ.ÿ0ÿ0ÿ,Vÿ,ÿNÿ*ÿ4ÿ5ÿ

最佳答案

正如我们在 Arduino 论坛上讨论的那样,删除延迟(100)


更新 1:

下一个问题是,每次没有收到 GPS 字符时,您都会打印 15 个字符。所以...您多次打印该消息。然后,无论您是否收到一个字符,您都会发送一条新的 XBee 消息。 Aaa并且您在循环每次迭代中打开和关闭SD文件。这是很多。所有这些都会阻止循环读取 GPS 字符。同样,这些字符在输入缓冲区中堆积,直到满了,然后它们开始被丢弃。

我建议查看我的 GPS 库的示例 NeoGPS 。它们都是围绕 GPS 更新间隔构建的。安装说明建议了一些可以尝试的草图。 Troubleshooting部分可能会帮助您理解 GPS 间隔和打印之间的交互(太多了!)。

重要的是要了解 GPS 设备每秒发送数百个字符(即“间隔”)。 NeoGPS 将这些字符解析为 fix 结构,并使其可用,每秒一次。在修复可用后,GPS 设备将“安静”,直到下一个间隔开始(可能在 0.4 秒内)。这是做其他事情的最佳时机,例如发送 XBee 消息。

此外,SoftwareSerial 效率非常低,因此它也可能会导致问题。如果您可以将 GPS 放在引脚 8 和 9 上,AltSoftSerial 是更好的选择。

顺便说一句,带元音变音的小写 y 是字符 255。我怀疑您在没有先测试 if (gps.available()) 的情况下调用了 gps.read() 。当没有可用字符时,read() 将返回 -1,打印为 255。您可能修改了一些我们看不到的内容。

Arduino 论坛是进行此类“对话”的更好场所。 (我正在下面回复您的评论...   :P)您的草图需要多次迭代才能生效。当它出现时,我们可以带着一个总结性的答案回到这里。 Here's your post如果你不介意去那里工作的话

关于c++ - arduino fio v3,GPS NMEA读取错误,疯狂输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251909/

相关文章:

c++ - 删除 pthread_t*

c++ - 派生类中的私有(private)重写虚函数

c - 如何从合法的未知值类型中提取标准注册表值类型?

c - iOS 库到 BitCode

c++ - 如何使用 Cmake 为 SimuroSot 模拟器构建(从 DevCpp 转换)Win32 DLL

c++ - DX11 中的顶点缠绕顺序

c++ - 使用 list::size() 后运行时间显着增加

c - Arduino 中断驱动与 Raspberry Pi 的 I2C 通信

c++ - 如何用快速傅里叶变换计算频率

c++ - 由于此错误,无法使用 microcoap 库。任何修复?