为什么我的Arduino代码不能为串行监视器打印纬度和经度?

时间:2018-04-10 22:36:14

标签: arduino gps

我正在使用带有NEO6MV2 GPS模块的NodeMCU。

代码:

#include <SoftwareSerial.h>
#include <TinyGPS.h>

long lati,lon; // create variable for latitude and longitude object
static const int RXPin = 5;  // (RX GPS -> D1 MCU)
static const int TXPin = 4;  // (TX GPS -> D2 MCU)
SoftwareSerial gpsSerial (RXPin, TXPin);

TinyGPS gps; // create gps object

void setup() {
  Serial.begin(9600); // connect serial
  gpsSerial.begin(4800); // connect gps sensor
}

int i=0;

void loop() {
  Serial.println("\nTest");
  Serial.println(i);
  delay(500);
  while(gpsSerial.available()) {
    // check for gps data
    if(gps.encode(gpsSerial.read())) {
      // encode gps data
      gps.get_position(&lati, &lon); // get latitude and longitude
      // display position
      Serial.print("Position: ");
      Serial.print("lat: ");Serial.print(lati);Serial.print(" "); // print latitude
      Serial.print("lon: ");Serial.println(lon); // print longitude
    }
  }
  i++;
}

对于那些了解这一点的人,我的GPS模块是否正确连接到我的NodeMCU(TX,RX引脚),即TX(GPS) - &gt; D2(MCU)和RX(GPS) - &gt; D1(MCU)?是否建议使用其他引脚?

假设我的引脚连接正确 - 我知道GPS模块本身工作正常 - 为什么我的串口显示器不打印纬度和经度?

我经历过如此多的教程,图书馆的变体,YouTube视频等。但似乎没有任何东西可以直接将NodeMCU连接到GPS模块,并在串行监视器和任何地方可读代码上打印。

提前致谢!

1 个答案:

答案 0 :(得分:0)

有几个问题:

  • 请勿使用延迟。在500ms期间,GPS设备可以发送500个字符。但输入缓冲区只有64个空间,因此大多数字符都会丢失。

  • 大多数GPS设备都以9600运行。

  • 你打印得太多了。这也会导致GPS字符丢失,因为草图必须等待打印完成。在NeoGPS Troubleshooting page上描述了这个以及其他一些问题。

这是草图的NeoGPS版本。

#include <SoftwareSerial.h>
#include <NMEAGPS.h>

static const int RXPin = 5;  // (RX GPS -> D1 MCU)
static const int TXPin = 4;  // (TX GPS -> D2 MCU)
SoftwareSerial gpsSerial (RXPin, TXPin);

NMEAGPS gps; // create gps object

void setup() {
  Serial.begin(9600); // connect serial
  gpsSerial.begin(9600); // default for most is 9600
  Serial.println("\nTest");
}

uint32_t loopCount = 0;

void loop() {

  if (gps.available( gpsSerial )) {
    // get the structure that contains all the parsed values
    gps_fix fix = gps.read();

    Serial.println( loopCount );

    // display position
    Serial.print("Position: ");
    if (fix.valid.location) {
      Serial.print("lat: "); Serial.print( fix.latitude(), 6 ); Serial.print(" ");
      Serial.print("lon: "); Serial.println( fix.longitude(), 6 );
    } else {
      Serial.println( '?' );
    }
  }

  loopCount++;
}

仅在新GPS定位完成时打印loopCount(每秒一次)。这将向您展示处理器与字符比率相比如何快速

如果您想尝试一下,可以从Arduino Library Manager的菜单 Sketch-&gt;下找到NeoGPS。包括图书馆 - &gt;管理图书馆,或从上面的链接。此外,NeoGPS比所有其他库更小,更快,更可靠,更准确。