Manejo de DOS SoftwareSerial

Pues estoy realizando un proyecto en el que tengo que manejar un módulo GPS (Ublox M8n) y un módulo GSM (Sim 800l), y ambos funcionan por puertos series.

El proyecto lo estoy realizando en una placa Arduino Nano ya que he leído que SoftwareSerial admite múltiples instancias que vas manejando con “mySoftwareSerial.listen()” y “mySoftwareSerial.end()”.

El caso es que cuando los manejo por separado, es decir, usando solo un SoftwareSerial, el código que tengo funciona, pero al intentar incluir los dos a la vez, no me responde.

Este es mi código:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;
SoftwareSerial ssGsm(2, 3);       //Serial gps RX-2  TX-3
SoftwareSerial ssGps(4, 5);       //Serial gsm RX-4  TX-5

void setup() {

 ssGps.begin(9600);
 ssGsm.begin(9600);
 Serial.begin(9600);
 Serial.println("Programa iniciado");

}

void loop() {
 
 ssGps.listen();                                 //Pongo a escuchar SoftSerial del gps
 if (ssGps.available()) {                        //Alimento el objeto TinyGps
   gps.encode(ssGps.read());
   if (gps.location.isUpdated()) {               //Si tiene posiciones nuevas
     Serial.println(gps.location.lat(), 6);      //La muestro
   }
 }
 
 ssGsm.listen();                                 //Escucho el SoftSerial del gsm
 if (Serial.available()) {                       //Si escribo comandos por monitor serie...
   while (Serial.available()) {                  //..y mientras haya datos..        
     ssGsm.write(Serial.read());                 //los mando al GSM
   }
   ssGsm.println();
 }

 if (ssGsm.available()) {                        //Si hay respuesta del GSM...
   Serial.write(ssGsm.read());                   //la mado al monitor serie
 }
}

La información que he encontrado por el foro y por la web es muy escasa y no he podido solucionar el problema, estoy estancado con el proyecto, he de decir que no soy ningún experto en la materia, por eso necesito de vuestra ayuda.

Gracias.

Por favor Lee las Normas del foro y edita tu post usando etiquetas.
No que lo vuelvas a publicar sino que lo EDITES. para que lo que publicaste se vea como corresponde.

Creo que ssGps.listen() y ssGsm.listen() "son el problema". Bueno, para ser más exacto, el problema está en la librería SoftwareSerial. Esta librería no puede recibir datos simultáneamente de dos puertos emulados a la vez. Por eso dispone de la función listen().

Sacado de la documentación de
SoftwareSerial::Listen()
:
Habilita el puerto serie del software seleccionado para escuchar. Solo un puerto serie de software se puede escuchar a la vez. Los datos que lleguen a otros puertos emulados serán descartados. Cualquier dato ya recibido se descarta durante la llamada a listen() (a menos que la instancia dada ya esté escuchando).

Esto significa que, si se está "escuchando" uno de los puertos emulados, se "pierden" los datos que transmita en ese momento cualquier otro puerto serie emulado. Supongo que no es lo que quieres, sino que lo que buscas es recibir datos simultaneamente de varios puertos series emulados. Para ello te recomiendo que busques otra librería de emulación de puertos series. Que no tenga, ni necesite, la función listen() (y obviamente deberías de quitar las llamadas a listen()).

Prueba, si quieres, con la librería GitHub - SlashDevin/NeoSWSerial: Efficient alternative to SoftwareSerial with attachInterrupt for RX c y ten en cuenta que está limitada a cuatro velocidades de transmisión: 9600 (por defecto), 19200, 31250 (MIDI) y 38400.

Otra opción sería que cambiaras a un Arduino con más puertos series "de verdad".

tu código envia dos señales al mismo tiempo , intenta poner una bandera o algo q las diferencia
por ejemplo talves te ayude, yo estoy leyendo varias señales del arduino y las gráfico en un programa en visual , lo que hago es sumar a cada señal 1025 , y en el programa le digo que solo me muestre en tal punto, valores menores o mayores a 1025 , asi los pongo como bandera y poder diferenciar

Alguien recomendó en su momento AltSoftwareSeral y no pierde los mensajes de los puertos virtuales.
Pero mi consejo es que uses un MEGA o DUE.

Muchas gracias por la respuesta, voy a probar con las librerias que comentais, porq el proyecto final iria en un arduino nano, por eso no empece el proyecto en el mega.

Para eso tendria que crear mi pcb propia con el chip atmega2560, y no tengo tantos conocimientos, jejeje, de momento.

Os contare si se me soluciono el problema.