Trying to understand/solving Software Serial error in ArduinoMEGA+GSM+GPS

Hi,

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

Arduino IDE: 1.8.3

    #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 (attached), I really don't understand what is this error and how do I solve it?

The Mega has 3 Hardware Serial ports. Why are you trying to use a Software Serial method?

To make it easy for people to help you please modify your post and use the code button </>
codeButton.png

so your code looks like this and is easy to copy to a text editor. See How to use the Forum

Your code is too long for me to study quickly without copying to my text editor. The text editor shows line numbers, identifies matching brackets and allows me to search for things like all instances of a particular variable or function.

Also please use the AutoFormat tool to indent your code for easier reading.

...R

They only thing you must try to understand, is that Mega has four (4) hardware serial ports.
It might take a bit of imagination to wire your shields to them, but it is the best thing that has ever happened to those who use multiple serial shields.

gfvalvo:
The Mega has 3 Hardware Serial ports. Why are you trying to use a Software Serial method?

Despite the stupid post title, and the #include statement, I don't see anywhere where the code actually uses a software serial instance.

My guess as to the problem is that the hardware isn't connected to the pins being read.

The sketch uses the Adafruit_GPS library, which uses the SoftwareSerial library. The GSM library has its own built-in software serial implementation. This causes the two libraries to conflict.

Minimal demonstration sketch:

#include <Adafruit_GPS.h>
#include <GSM.h>
void setup() {}
void loop() {}

The sketch uses the Adafruit_GPS library, which uses the SoftwareSerial library. The GSM library has its own built-in software serial implementation.

With some level of programming capability slightly above brain-fart, neither of those statement should be true, when compiling for the Mega. It's a sad fact that they are true.

Adafruit needs to fix their damned library. So does the Arduino team.

Yeah, the GSM library bothers me every time I'm forced to make contact with it. I don't know what they were thinking. Unfortunately, I don't think there is any chance of Arduino doing any significant work on the GSM library since the GSM shields that use it are long retired and they have a new direction for GSM with the MKR GSM 1400 and the MKRGSM library.