Code problem w/ Uno+GPS+GPRS?
It seems you're using the same hardware Serial port for both your PC and the GPS module. This will result in the GPS module receiving everything you send to the PC with Serial.print() and this may be the cause of your problem, as it could confuse the module and either make it send an endless stream of gibberish and/or making isValid() to always be false. You should instead create a SoftwareSerial instance attached to any 2 digital pins (maybe 2 and 3) like this:

SoftwareSerial ss(2, 3);


and in setup():

ss.begin(9600);  // use your module baud rate


Then at the top of loop(), use this instead:

while (ss.available() &gt; 0)
    gps.encode(ss.read());


Get rid of the recursive call of loop() within loop() since it will cause your stack to rapidly overflow.

If you want data to only be sent when the location values are updated based on recent received data (but not necessarily changed, since you may still be at the same location), you should use if (gps.location.isUpdated()) instead.

Your call of dtostrf() is also wrong. The second argument should be the length of the string to be created (including decimal point) and the 3rd argument should be the number of digits after the decimal point. Something like this should be okay:

dtostrf(gps.location.lat(), 10, 6, latitude); 


You can also put this at the end of loop() to check if data is actually being received from the module and processed by the library:

if (millis() &gt; 5000 &amp;&amp; gps.charsProcessed() &lt; 10)
  Serial.println(F("WARNING: No GPS data.  Check wiring."));
  while (1){ // infinite loop
    if (ss.available())
      Serial.print(ss.read());
  }
}    


This site may provide additional details.