Prueba esta función y nos cuentas:
void read_String2() {
delay(100); // Dependiendo de la velocidad del puerto serial, sería prudente esperar un poco para recibir la cadena completa
if (gprsSerial.available())
inData2[gprsSerial.readBytes(inData2,
gprsSerial.available() < sizeof(inData2) - 1 ? gprsSerial.available() : sizeof(inData2) - 1)] = 0;
}
Explicación de esta línea:
inData2[gprsSerial.readBytes(inData2,
gprsSerial.available() < sizeof(inData2) - 1 ? gprsSerial.available() : sizeof(inData2) - 1)] = 0;
Básicamente dice que lea todos los bytes/caracteres disponibles, pero sin desbordar el búfer. Esto es posible mediante la respuesta a la pregunta: "¿la cantidad de bytes disponibles es menor (o igual) que el tamaño del búfer menos uno?"
¿Por qué "tamaño del búfer menos uno"? Obligatoriamente hay que reservar un espacio para el terminador de cadenas de caracteres; si se coloca fuera del búfer, pueden haber problemas.
readBytes retorna la cantidad de bytes/caracteres que en realidad se lograron leer; dicho valor se puede aprovechar para determinar la posición en donde debe colocarse el terminador.
Si no hubiera nada para leer, esta función retornaría cero; lo que, por ende, resultaría en colocar el terminador en la primera posición (se leería como una cadena vacía).