arduino fio v3,GPS NMEA阅读错误,疯狂输出

时间:2016-10-26 00:39:21

标签: 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

$ 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();
}
  

数据看起来应该是正确的,但显示很奇怪   字符。

     

删除延迟后,这就是我的输出:

     

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

1 个答案:

答案 0 :(得分:0)

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

<小时/>

更新1:

下一个问题是,每次接收GPS角色时,您将打印15个字符。所以...你打印的信息很多。然后,无论您是否收到一个字符,都会发送一条新的XBee消息。 Aaaand你在{em>每次迭代loop上打开和关闭SD文件。那是很多。所有这些都让loop无法阅读GPS角色。同样,这些字符在输入缓冲区中堆叠,直到它完整,然后它们开始被丢弃。

我建议查看我的GPS库的示例NeoGPS。它们都是围绕GPS更新间隔构建的。安装说明提示了一些草图。 Troubleshooting部分可以帮助您了解GPS间隔与打印之间的相互作用(过多!)。

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

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

BTW,带有变音符号的小写y是字符255.我怀疑你没有先测试gps.read()就调用了if (gps.available())。如果没有可用的字符,read()将返回-1,打印为255.您可能修改了我们看不到的内容。

Arduino论坛对于这种“对话”来说会更好。 (我正在回复你的评论......:P)在草图工作之前需要多次迭代。如果确实如此,我们可以回到这里,总结一下。 Here's your post如果你不介意在那里工作。