0

Trying to solve Software Serial Issue in GPS Shield
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Trying to solve Software Serial Issue in GPS Shield

by thiyagarajan_mb on Sat Feb 09, 2019 2:16 pm

Hi,

Target: I would like to send the GPS data to my web server using Arduino Mega + GSM Shield( from Arduino older version Board) + Adafruit GPS Shield.

Code: Select all | TOGGLE FULL SIZE
 #include <GSM.h>
    #include <Adafruit_GPS.h>
    #include <AltSoftSerial.h>

    #define mySerial Serial1

    Adafruit_GPS GPS(&mySerial);

    #define GPSECHO  true


    boolean usingInterrupt = false;
    void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy


    #define PINNUMBER "xxxx"

    // APN data
    #define GPRS_APN       "GPRS_APN" // replace your GPRS APNgpsll
    #define GPRS_LOGIN     "login"    // replace with your GPRS login
    #define GPRS_PASSWORD  "password" // replace with your GPRS password


    // initialize the library instance
    GSM gsmAccess;
    GSMClient client;
    GPRS gprs;

    // URL, path & port (for example: arduino.cc)
    char server[] = "http://x.x.x.x";
    char path[] = "/tracegps.php";
    int port = 80; // port 80 is the default for HTTP



    void setup()
    {
     
      // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
      // also spit it out
      Serial.begin(115200);
      Serial.println("Adafruit GPS library basic test!");
       boolean notConnected = true;
   
        while(notConnected)
      {
         if((gsmAccess.begin(PINNUMBER)==GSM_READY) &
          (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
          notConnected = false;
        else
        {
          Serial.println("Not connected");
          delay(1000);
        }
      }
      Serial.println("GSM initialized");
   

      // 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
      GPS.begin(9600);
   
      // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      // uncomment this line to turn on only the "minimum recommended" data
      //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
      // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since
      // the parser doesn't care about other sentences at this time
   
      // Set the update rate
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // 1 Hz update rate
      // For the parsing code to work nicely and have time to sort thru the data, and
      // print it out we don't suggest using anything higher than 1 Hz

      // Request updates on antenna status, comment out to keep quiet
      GPS.sendCommand(PGCMD_ANTENNA);

      // the nice thing about this code is you can have a timer0 interrupt go off
      // every 1 millisecond, and read data from the GPS for you. that makes the
      // loop code a heck of a lot easier!
      useInterrupt(true);

      delay(1000);
      // Ask for firmware version
      mySerial.println(PMTK_Q_RELEASE);
 
    }


    // Interrupt is called once a millisecond, looks for any new GPS data, and stores it
    SIGNAL(TIMER0_COMPA_vect) {
      char c = GPS.read();
      // if you want to debug, this is a good time to do it!
    #ifdef UDR0
      if (GPSECHO)
        if (c) UDR0 = c;
        // writing direct to UDR0 is much much faster than Serial.print
        // but only one character can be written at a time.
    #endif
    }

    void useInterrupt(boolean v) {
      if (v) {
        // Timer0 is already used for millis() - we'll just interrupt somewhere
        // in the middle and call the "Compare A" function above
        OCR0A = 0xAF;
        TIMSK0 |= _BV(OCIE0A);
        usingInterrupt = true;
      } else {
        // do not call the interrupt function COMPA anymore
        TIMSK0 &= ~_BV(OCIE0A);
        usingInterrupt = false;
      }
    }

    uint32_t timer = millis();
    void loop()                     // run over and over again
    {
   
      // in case you are not using the interrupt above, you'll
      // need to 'hand query' the GPS, not suggested :(
      if (! usingInterrupt) {
        // read data from the GPS in the 'main loop'
        char c = GPS.read();
        // if you want to debug, this is a good time to do it!
        if (GPSECHO)
          if (c) Serial.print(c);
      }
   
      // if a sentence is received, we can check the checksum, parse it...
      if (GPS.newNMEAreceived()) {
        // a tricky thing here is if we print the NMEA sentence, or data
        // we end up not listening and catching other sentences!
        // so be very wary if using OUTPUT_ALLDATA and trytng to print out data
        //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
   
        if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
          return;  // we can fail to parse a sentence in which case we should just wait for another
      }

      // if millis() or timer wraps around, we'll just reset it
      if (timer > millis())  timer = millis();

      // approximately every 2 seconds or so print out the current stats
      if (millis() - timer > 15000) {
        timer = millis(); // reset the timer
     
        Serial.print("\nTime: ");
        Serial.print(GPS.hour, DEC); Serial.print(':');
        Serial.print(GPS.minute, DEC); Serial.print(':');
        Serial.print(GPS.seconds, DEC); Serial.print('.');
        Serial.println(GPS.milliseconds);
        Serial.print("Date: ");
        Serial.print(GPS.day, DEC); Serial.print('/');
        Serial.print(GPS.month, DEC); Serial.print("/20");
        Serial.println(GPS.year, DEC);
        Serial.print("Fix: "); Serial.print((int)GPS.fix);
        Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
        if (GPS.fix) {
          Serial.print("Location: ");
          Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
          Serial.print(", ");
          Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
       
          Serial.print("Speed (knots): "); Serial.println(GPS.speed);
          Serial.print("Angle: "); Serial.println(GPS.angle);
          Serial.print("Altitude: "); Serial.println(GPS.altitude);
          Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
         
            if (client.connect(server, port))
              {

                 client.print("GET /tracegps.php?");
                 Serial.print("GET /tracegps.php?");
                 client.print("Fix=");client.print(GPS.fix);
                 client.print("&&Quality=");client.print(GPS.fixquality);
                 client.print("&&Latdirection=");client.print(GPS.lat);
                 client.print("&&Latvalue=");client.print(GPS.latitude);
                 client.print("&&Londirection=");client.print(GPS.lon);
                 client.print("&&Lonvalue=");client.print(GPS.longitude);
                 client.print("&&Speed=");client.print(GPS.speed * 1.85);
                 client.print("&&Altitude=");client.print(GPS.altitude);
                 client.print("&&Satellites=");client.print(GPS.satellites);
 
                 client.println(" HTTP/1.1");
                 Serial.println(" HTTP/1.1");
                 client.println("Host: http://x.x.x.x");
                 Serial.println("Host: http://x.x.x.x");
                 client.println("User-Agent: Arduino");
                 Serial.println("User-Agent: Arduino");
                 client.println("Accept: text/html");
                 Serial.println("Accept: text/html");
                 client.println("Connection: close");
                 Serial.println("Connection: close");
                 client.println();
                 Serial.println();

                 Serial.println("\nCOMPLETE!\n");
                 client.stop();
 
              }

         else
              {

                Serial.println("connection failed");
                Serial.println("\n FAILED!\n");
              }
 
       
       
            }

     
      }
     

    }




But I get the Following Error , I really don't understand what are these errors and how do I solve it?

Code: Select all | TOGGLE FULL SIZE
In file included from /Users/thiyaga/Documents/Arduino/libraries/GSM/src/GSM.h:46:0,
                 from /Users/thiyaga/Documents/Arduino/Tracking/Tracking.ino:10:
/Users/thiyaga/Documents/Arduino/libraries/GSM/src/GSM3ShieldV1BandManagement.h:49:125: warning: 'typedef' was ignored in this declaration
 typedef enum GSM3GSMBand {UNDEFINED, EGSM_MODE, DCS_MODE, PCS_MODE, EGSM_DCS_MODE, GSM850_PCS_MODE, GSM850_EGSM_DCS_PCS_MODE};
                                                                                                                             ^
/Users/thiyaga/Documents/Arduino/Tracking/Tracking.ino: In function 'void setup()':
/Users/thiyaga/Documents/Arduino/Tracking/Tracking.ino:56:39: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
          if((gsmAccess.begin(PINNUMBER)==GSM_READY) &
                                       ^
/Users/thiyaga/Documents/Arduino/Tracking/Tracking.ino:57:63: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
           (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY))
                                                               ^
/Users/thiyaga/Documents/Arduino/Tracking/Tracking.ino:57:63: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
/Users/thiyaga/Documents/Arduino/Tracking/Tracking.ino:57:63: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
libraries/SoftwareSerial/SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_9'
libraries/GSM/GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here
/private/var/folders/5g/dzr6kltn3p9fj53nx8sxmd_w0000gn/T/AppTranslocation/7997A2E7-9171-4F3B-9E5F-771C82115595/d/Arduino.app/Contents/Java/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld: Disabling relaxation: it will not work with multiple definitions
libraries/SoftwareSerial/SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_11'
libraries/GSM/GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here
Multiple libraries were found for "GSM.h"
 Used: /Users/thiyaga/Documents/Arduino/libraries/GSM
libraries/SoftwareSerial/SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
 Not used: /private/var/folders/5g/dzr6kltn3p9fj53nx8sxmd_w0000gn/T/AppTranslocation/7997A2E7-9171-4F3B-9E5F-771C82115595/d/Arduino.app/Contents/Java/libraries/GSM
(.text+0x0): multiple definition of `__vector_10'
libraries/GSM/GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.
Attachments
prototype (1).jpg
prototype (1).jpg (242.36 KiB) Viewed 35 times
thiyagarajan_mb
 
Posts: 19
Joined: Thu May 08, 2014 3:56 am

Please be positive and constructive with your questions and comments.