您好我有一台在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
#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ÿ
答案 0 :(得分:0)
正如我们在Arduino论坛上讨论的那样,删除delay(100)
。
<小时/>
下一个问题是,每次不接收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如果你不介意在那里工作。