GPS works fine on Arduino Uno, but doesn't work on MEGA 2560

I am using this code on an arduino uno and have conected the TX pin of the GPS to the RX pin of the UNO. I get the NMEA data on the serial monitor.

However when I’m doing the exact same thing on a MEGA, it simply doesn’t work. I get nothing on the serial monitor.

What am I doing wrong?



 Example code for connecting a Parallax GPS module to the Arduino

 Igor Gonz?lez Mart?n. 05-04-2007

 English translation by djmatic 19-05-2007

 Listen for the $GPRMC string and extract the GPS location data from this.
 Display the result in the Arduino's serial monitor.


 #include <string.h>
 #include <ctype.h>

 int ledPin = 13;                  // LED test pin
 int rxPin = 0;                    // RX PIN 
 int txPin = 1;                    // TX TX
 int byteGPS=-1;
 char linea[300] = "";
 char comandoGPR[7] = "$GPRMC";
 int cont=0;
 int bien=0;
 int conta=0;
 int indices[13];

 void setup() {
   pinMode(ledPin, OUTPUT);       // Initialize LED pin
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   for (int i=0;i<300;i++){       // Initialize a buffer for received data
     linea[i]=' ';

 void loop() {
   digitalWrite(ledPin, HIGH);;         // Read a byte of the serial port
   if (byteGPS == -1) {           // See if the port is empty yet
   } else {
     linea[conta]=byteGPS;        // If there is serial port data, it is put in the buffer
     Serial.print(byteGPS, BYTE); 
     if (byteGPS==13){            // If the received byte is = to 13, end of transmission
       digitalWrite(ledPin, LOW); 
       for (int i=1;i<7;i++){     // Verifies if the received command starts with $GPR
         if (linea[i]==comandoGPR[i-1]){
       if(bien==6){               // If yes, continue and process the data
         for (int i=0;i<300;i++){
           if (linea[i]==','){    // check for the position of the  "," separator
           if (linea[i]=='*'){    // ... and the "*"
         Serial.println("");      // ... and write to the serial port
         for (int i=0;i<12;i++){
             case 0 :Serial.print("Time in UTC (HhMmSs): ");break;
             case 1 :Serial.print("Status (A=OK,V=KO): ");break;
             case 2 :Serial.print("Latitude: ");break;
             case 3 :Serial.print("Direction (N/S): ");break;
             case 4 :Serial.print("Longitude: ");break;
             case 5 :Serial.print("Direction (E/W): ");break;
             case 6 :Serial.print("Velocity in knots: ");break;
             case 7 :Serial.print("Heading in degrees: ");break;
             case 8 :Serial.print("Date UTC (DdMmAa): ");break;
             case 9 :Serial.print("Magnetic degrees: ");break;
             case 10 :Serial.print("(E/W): ");break;
             case 11 :Serial.print("Mode: ");break;
             case 12 :Serial.print("Checksum: ");break;
           for (int j=indices[i];j<(indices[i+1]-1);j++){
       conta=0;                    // Reset the buffer
       for (int i=0;i<300;i++){    //  
         linea[i]=' ';             

Take these out, Serial.begin() takes over the pins:

int rxPin = 0; // RX PIN int txPin = 1; // TX TX

pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT);

You are using a breakout cable or something to connect the Rx/Tx port to both the GPS and the PC?

Took the lines out, but I'm still not getting anything on the serial monitor.

I simply conected the TX wire from the GPS into RX0, which is the exact same thing I did for the Uno.


Try a different Rx then, say Rx1. Perhaps the ATMega8U2 or 16U2 is setup a little differently between the Uno and the Mega.

Serial1.begin(), etc.

Thanks a lot!

That worked.

Say Octo27, Do you mind sharing the final code that you used to get the Mega 2560 to talk with your GPS? Thanks in advance, Rick