0

我一直在积极尝试将“Ultimate Breakout GPS v3”与 Ardunio UNO 连接并同时运行 BLYNK 应用程序。我有一个功能齐全的 GPS 模块在它自己的草图中工作,我还有一个功能齐全的 BLYNK 应用程序在它自己的草图中工作。但是,当我尝试组合代码以使 GPS 和 BLYNK 应用程序一起工作时,我的 GPS 代码卡在了一个 while 循环中。我认为这可能与我用于应用程序和 GPS 模块的软件串行通信有关,但我现在还在上大学,对学习这些概念还是很陌生。我只能想附上整个代码,这样你就可以看到发生了什么。

//Bluetooth/Blynk Definitions

#define BLYNK_USE_DIRECT_CONNECT
#define BLUETOOTH_TX_PIN 10
#define BLUETOOTH_RX_PIN 11

#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
//#include <BlynkSimpleStream.h>
#include <BlynkSimpleSerialBLE.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>

//Cart GPS Definitions
#define GPS_TX_PIN 4
#define GPS_RX_PIN 5



char auth[] = "ruf1xsvCA3b-YPsR8CTGT2CgYwEYj78t";


//Serial Setups

SoftwareSerial bluetoothSerial(BLUETOOTH_TX_PIN, BLUETOOTH_RX_PIN); //(10,11)
SoftwareSerial cartSerial(GPS_TX_PIN, GPS_RX_PIN); //(4,5)


//Global Varibles

int x, y; //X,Y for Joystick Data
String NMEA1; //variable for first NMEA sentence
String NMEA2; //variable for second NMEA sentence
double cartLat, cartLon; 
char c; //to read characters coming from GPS

struct GeoLoc {
  float lat;
  float lon;
};

GeoLoc cartLoc;




//Joystick
BLYNK_WRITE(V10) {
  x = param[0].asInt(); // It extracts the x value of the Joystick inlcuded in the Mobile APP Blynk
  y = param[1].asInt(); // It extracts the y value of the Joystick inlcuded in the Mobile APP Blynk

  Serial.print("JoyX:"); Serial.println(x);
  Serial.print("JoyY:"); Serial.println(y);
}

//User GPS
double userLon, userLat, userAlt, userSpeed;
BLYNK_WRITE(V11) {
  GpsParam gps(param);
  userLon = gps.getLon();
  userLat = gps.getLat();
  userAlt = gps.getAltitude();
  userSpeed = gps.getSpeed();

  Serial.print("userLat: "); Serial.println(userLat, 7);
  Serial.print("userLon: "); Serial.println(userLon, 7);

  cartLoc = getLocation();

  Serial.print("cartLat: "); Serial.println(cartLoc.lat, 7);
  Serial.print("cartLon: "); Serial.println(cartLoc.lon, 7);

}

//cartGPS

Adafruit_GPS cartGPS(&cartSerial);


void readCartGPS(){

  Serial.print("Start of readCartGPS");
  clearCartGPS();
  Serial.print("Start of Whileloop");
  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
    Serial.print("Inside");
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence
  NMEA1 = cartGPS.lastNMEA();

  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
  }
  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence
  NMEA2 = cartGPS.lastNMEA();


  Serial.print("NMEA1:"); Serial.print(NMEA1);
  Serial.print("NMEA2:"); Serial.println(NMEA2);
}

void clearCartGPS(){  //Clear old and corrupt data from Serial Port

  Serial.print("Start of clearCartGPS");
  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
    Serial.println("DEBUG: INSIDE WHILE");
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence

  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence

  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence

}

GeoLoc getLocation(){

    Serial.print("Start of GetLocation");
    readCartGPS();
    Serial.print("After readCartGPS is run");
    delay(300);

    cartLat = cartGPS.latitude;
    char latDirection = cartGPS.lat;
    if(latDirection == 'S'){
      cartLat = -1 * cartLat;
    }

    cartLon = cartGPS.longitude;
    char lonDirection = cartGPS.lon;
    if(lonDirection == 'W'){
      cartLon = -1 * cartLon;
    }



    cartLoc.lat = cartLat;
    cartLoc.lon = cartLon; 

//    Serial.print("Cart Latitude: "); Serial.println(cartLat, 7);
//    Serial.print("");
//    
//    Serial.print("Cart Longitude: "); Serial.println(cartLon, 7);
//    Serial.print("");

    return(cartLoc);

}


void setup() {

  Serial.begin(4800);

  cartGPS.begin(9600);
  cartGPS.sendCommand("$PGCMD,33,0*6D"); //Turn off antenna update message
  cartGPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ); //Set update rate to 10Hz
  cartGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //Request RMC and GGA sentences only

  bluetoothSerial.begin(9600);
  Blynk.begin(bluetoothSerial, auth);
  Serial.println("Test_Setup");

}

void loop() {

  Blynk.run();

  delay(100);

}

如果我在 Arduino 上运行此代码,那么我的串行监视器将显示以下内容:(请注意,BLYNK_WRITE(V11) 是 BLYNK 应用程序中的 GPS“小部件”更新时触发的中断)

Test_Setup
userLat: 42.1978645
userLon: -83.1744308
Start of GetLocation
Start of readCartGPS
Start of clearCartGPS
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE

但是,如果我只隔离与 cartGPS 相关的代码,那么串行监视器将显示:

NMEA1:$GPRMC,232347.000,A,4211.8708,N,08310.4676,W,0.08,78.84,091119,,,A*4D
NMEA2:$GPGGA,232348.000,4211.8708,N,08310.4675,W,1,08,1.06,171.9,M,-33.9,M,,*5C

Cart Latitude: 4211.8706054
Cart Longitude: -8310.4677734
NMEA1:$GPRMC,232350.000,A,4211.8707,N,08310.4676,W,0.06,164.81,091119,,,A*73
NMEA2:$GPGGA,232351.000,4211.8707,N,08310.4675,W,1,08,1.06,171.9,M,-33.9,M,,*5B

Cart Latitude: 4211.8706054
Cart Longitude: -8310.4677734

这是预期的。

4

1 回答 1

0

只是一个简短的评论 - 您可能希望将延迟命令从您的 void 循环中取出。您可以为其创建一个计时器事件并将 timer.run 放在 void 循环中

于 2019-11-11T21:34:46.433 回答