Arduino与GPS gy Neo 6Mv2连接

时间:2018-03-30 18:06:12

标签: arduino gps

我写了以下代码。我想要从方法

返回的字符串
  

displayInfo()

只需更新和打印一次,但该方法会重复发送字符串。如果我在void setup()函数中复制相同的代码,则不会打印任何值。

  #include <TinyGPS++.h>
  #include <SoftwareSerial.h>
  static const int RXPin = 12, TXPin = 13;
  static const uint32_t GPSBaud = 9600;
  // The TinyGPS++ object

  TinyGPSPlus gps;


  // The serial connection to the GPS

  SoftwareSerial ss(RXPin, TXPin);

  String msg="";

  String message="";


  void setup()

  {

   Serial.begin(9600);
   ss.begin(GPSBaud);

   }


  void loop()

  {

   while (ss.available() > 0)

   if (gps.encode(ss.read()))

   message = displayInfo();

   Serial.print(message);

   }


  String displayInfo()
  {
  if (gps.location.isValid())
  {
  String lati=String(gps.location.lat(), 3);
  String logi=String(gps.location.lng(),3);
  msg=lati+","+logi+"\n";
  return(msg);
  }
  }

我已经更新了代码以恢复一些错误,比如函数返回值和全局变量,但是即使在我将void loop()代码放入void setup()之后它仍然没有为我提供单个String值/ p>

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


static const int RXPin = 12, TXPin = 13;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
String msg="";

void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);

  while (ss.available()>0)
   if (gps.encode(ss.read()))
    displayInfo();
     Serial.print(msg);

}

void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.


}

void displayInfo()
{
  //Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    String lati=String(gps.location.lat(), 3);
    String longi=String(gps.location.lng(), 3);
    msg="location: "+lati+","+longi+"\n";  
  }
  else
  { 
    msg=msg+"invalid";
  }
  }

1 个答案:

答案 0 :(得分:0)

修改的: ss(SoftwareSerial)有一个缓冲区,其中包含准备发送的数据。 ss.begin()将在您的设置中返回0,因为缓冲区仍为空,因此while循环将不会迭代一次。

arduino的loop()函数工作了一段时间,因此通过放置while循环的内容,并用if替换while,您将能够继续测试,直到缓冲区中有消息。 / p>

通过添加布尔值来检查您是否已发送消息,您可以确保只发送一条消息。

  #include <TinyGPS++.h>
  #include <SoftwareSerial.h>
  static const int RXPin = 12, TXPin = 13;
  static const uint32_t GPSBaud = 9600;

  TinyGPSPlus gps;

  SoftwareSerial ss(RXPin, TXPin);

  boolean sent = false;

  void setup()
  {
   Serial.begin(9600);
   ss.begin(GPSBaud);   
  }

  void loop()
  {
   if (ss.available()>0 && sent == false){
    if (gps.encode(ss.read())){
     String msg = displayInfo();
     if (msg != NULL){
      Serial.print(msg);
      sent = true;
     }
    }
   }
  }

  String displayInfo()
  {
   if (gps.location.isValid())
   {
    String msg="";
    String lati=String(gps.location.lat(), 3);
    String logi=String(gps.location.lng(),3);
    msg=lati+","+logi+"\n";
    return(msg);
   }
   else{
     return NULL;
   }
  }

通过在displayinfo()的else语句中返回NULL,并在循环()中对其进行测试,可以确保只在一切正常时才打印消息。