Localização veículo via sms + google mapas

Pessoal, vocês podem me ajudar ? 
estou fazendo um código aqui para que ele me envie um link do google mapas  com a localização do veículo.Os passos iniciais funcionam, armazena no micro SD como eu quero mas não envia via sms com o link.Peguei o código e fui modificando , incluindo algumas coisas para me ajudar. 

O código é esse : 

#include <SPI.h>
#include <SD.h>
#include <TinyGPS++.h>

#define ARDUINO_USD_CS 8 // uSD card CS pin (pin 8 on Duinopeak GPS Logger Shield)

String avalia = "";
int conta = 0;

/////////////////////////
// Log File Defintions //
/////////////////////////
// Keep in mind, the SD library has max file name lengths of 8.3 - 8 char prefix,
// and a 3 char suffix.
// Our log files are called "gpslogXX.csv, so "gpslog99.csv" is our max file.
#define LOG_FILE_PREFIX "gpslog" // Name of the log file.
#define MAX_LOG_FILES 100 // Number of log files that can be made
#define LOG_FILE_SUFFIX "csv" // Suffix of the log file
char logFileName[13]; // Char string to store the log file name
// Data to be logged:
#define LOG_COLUMN_COUNT 8
char * log_col_names[LOG_COLUMN_COUNT] = {
"longitude", "latitude", "altitude", "speed", "course", "date", "time", "satellites"
}; // log_col_names is printed at the top of the file.

//////////////////////
// Log Rate Control //
//////////////////////
#define LOG_RATE 5000 // Log every 5 seconds
unsigned long lastLog = 0; // Global var to keep of last time we logged

/////////////////////////
// TinyGPS Definitions //
/////////////////////////
TinyGPSPlus tinyGPS; // tinyGPSPlus object to be used throughout
#define GPS_BAUD 9600 // GPS module's default baud rate

////////////////////////////////////////////////
// Arduino GPS Shield Serial Port Definitions //
////////////////////////////////////////////////
// If you're using an Arduino Uno, Mega, RedBoard, or any board that uses the
// 0/1 UART for programming/Serial monitor-ing, use SoftwareSerial:
#include <SoftwareSerial.h>
#define ARDUINO_GPS_RX 3 // GPS TX, Arduino RX pin
#define ARDUINO_GPS_TX 2 // GPS RX, Arduino TX pin
SoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX); // Create a SoftwareSerial
SoftwareSerial SIM900(10, 11);

// Set gpsPort to either ssGPS if using SoftwareSerial or Serial1 if using an
// Arduino with a dedicated hardware serial port
#define gpsPort ssGPS // Alternatively, use Serial1 on the Leonardo

// Define the serial monitor port. On the Uno, Mega, and Leonardo this is 'Serial'
// on other boards this may be 'SerialUSB'
#define SerialMonitor Serial

void setup()
{
SIM900.begin(9600);
SerialMonitor.begin(9600);
gpsPort.begin(GPS_BAUD);

SerialMonitor.println("Setting up SD card.");
// see if the card is present and can be initialized:
if (!SD.begin(ARDUINO_USD_CS))
{
SerialMonitor.println("Error initializing SD card.");
}
updateFileName(); // Each time we start, create a new file, increment the number
printHeader(); // Print a header at the top of the new file
}

void loop()
{
if ((lastLog + LOG_RATE) <= millis())
{ // If it's been LOG_RATE milliseconds since the last log:
if (tinyGPS.location.isUpdated()) // If the GPS data is vaild
{
if (logGPSData()) // Log the GPS data
{
SerialMonitor.println("GPS logged."); // Print a debug message
lastLog = millis(); // Update the lastLog variable
}
else // If we failed to log GPS
{ // Print an error, don't update lastLog
SerialMonitor.println("Failed to log new GPS data.");
}
}
else // If GPS data isn't valid
{
// Print a debug message. Maybe we don't have enough satellites yet.
SerialMonitor.print("No GPS data. Sats: ");
SerialMonitor.println(tinyGPS.satellites.value());
}
}

// If we're not logging, continue to "feed" the tinyGPS object:
while (gpsPort.available())
tinyGPS.encode(gpsPort.read());
}

byte logGPSData()
{
File logFile = SD.open(logFileName, FILE_WRITE); // Open the log file

if (logFile)
{ // Print longitude, latitude, altitude (in feet), speed (in mph), course
// in (degrees), date, time, and number of satellites.
logFile.print(tinyGPS.location.lng(), 6);
logFile.print(',');
logFile.print(tinyGPS.location.lat(), 6);
logFile.print(',');
logFile.print(tinyGPS.altitude.feet(), 1);
logFile.print(',');
logFile.print(tinyGPS.speed.mph(), 1);
logFile.print(',');
logFile.print(tinyGPS.course.deg(), 1);
logFile.print(',');
logFile.print(tinyGPS.date.value());
logFile.print(',');
logFile.print(tinyGPS.time.value());
logFile.print(',');
logFile.print(tinyGPS.satellites.value());
logFile.println();
logFile.close();

GSMsms();

return 1; // Return success
}

return 0; // If we failed to open the file, return fail
}

// printHeader() - prints our eight column names to the top of our log file
void printHeader()
{
File logFile = SD.open(logFileName, FILE_WRITE); // Open the log file

if (logFile) // If the log file opened, print our column names to the file
{
int i = 0;
for (; i < LOG_COLUMN_COUNT; i++)
{
logFile.print(log_col_names[i]);
if (i < LOG_COLUMN_COUNT - 1) // If it's anything but the last column
logFile.print(','); // print a comma
else // If it's the last column
logFile.println(); // print a new line
}
logFile.close(); // close the file
}
}

// updateFileName() - Looks through the log files already present on a card,
// and creates a new file with an incremented file index.
void updateFileName()
{
int i = 0;
for (; i < MAX_LOG_FILES; i++)
{
memset(logFileName, 0, strlen(logFileName)); // Clear logFileName string
// Set logFileName to "gpslogXX.csv":
sprintf(logFileName, "%s%d.%s", LOG_FILE_PREFIX, i, LOG_FILE_SUFFIX);
if (!SD.exists(logFileName)) // If a file doesn't exist
{
break; // Break out of this loop. We found our index
}
else // Otherwise:
{
SerialMonitor.print(logFileName);
SerialMonitor.println(" exists"); // Print a debug statement
}
}
SerialMonitor.print("File name: ");
SerialMonitor.println(logFileName); // Debug print the file name
}

void sendsms()
{
delay(400);
Serial.println("AT + CMGS = \"+55xxxxxxxxxx\"");
delay(300);

Serial.print("http://maps.google.com/maps?q=loc:");
//SIM900.print("Latitude = ");
Serial.print(tinyGPS.location.lat(), 6);
//SIM900.print(" Longitude = ");

Serial.print(",");
Serial.print(tinyGPS.location.lng(), 6);
delay(200);
Serial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(200);
Serial.println();

if (millis() > 5000 && tinyGPS.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while(true);
}
}

void comando(String comand)
{
conta++;
avalia = "";
SIM900.print(comand);
while(SIM900.available()<=0) Serial.print("preso passo "), Serial.println(conta), delay(200);

while(SIM900.available()>0)
{
char letra = SIM900.read();
if (isAlphaNumeric(letra)) avalia += letra;
}

if (avalia=="OK") Serial.print("passo"), Serial.println(conta);
else Serial.print("avalia: "), Serial.println(avalia);
delay(200);
}

void GSMsms()
{

comando("AT+CMGF=1\r\n");
comando("ATE0\r\n");
comando("AT+CNMI=1,2,0,0,0\r\n");

/*
SIM900.print("AT+CMGF=1\r");
SIM900.print("ATE0\r");
SIM900.print("AT+CNMI=1,2,0,0,0\r");
*/
delay(400);


SIM900.print("AT+CMGS=\r\n");
SIM900.write(0x22);//aspa dupla
SIM900.print("+55xxxxxxxxx");
SIM900.write(0x22);//aspa dupla
SIM900.println();
delay(400);

SIM900.print("http://maps.google.com/maps?q=loc:");
SIM900.print(tinyGPS.location.lat(), 6);
SIM900.print(",");
SIM900.print(tinyGPS.location.lng(), 6);
SIM900.write(0x1A);
SIM900.write(0x0D);
SIM900.write(0x0A);
Serial.println("Enviando mensagem...");
delay(1000);
}

 

HARDWARE USADO :

SIM 900A

ARDUINO UNO

ARDUINO SHIELD