Problema uso dual softserial in libreria sim800l - [RISOLTO]

Buongiorno a tutti

in questi giorni di pausa (di cui avremmo fatto tutti a meno) ho ripreso un vecchio progetto per passarmi il tempo. Vi posto alcune informazioni utili ad inquadrare il problema:

hardware
ho installato 4 arduino nano sulla mia moto uno dei quali è equipaggiato con un modulo gps che invia dai sulla seriale hardware ed un modulo gsm che invia dati su una software serial. E' il master di un sistema i2c. Il sistema funziona correttamente. A questo sistema ho aggiunto un modulo BLE HM10
Funziona tutto correttamente almeno dal punto di vista hardware.

software
Ho modificato il codice perfettamente funzionante inserendo quando sotto:

// parte dichiarata 

Sim800l Sim800l;                  // to declare the library
TinyGPSPlus gps;                  // The TinyGPS++ object
SoftwareSerial BLE_Serial(6, 7);  // RX, TX   <<<< ------ Nuova

// parte nella void setup

  Serial.begin(9600);
  BLE_Serial.begin(9600);  // nuova
  Wire.begin();

// parte nella void loop

BLE_Serial.listen();
  delay(1500);
  byte n = 0;
  while (BLE_Serial.available()) {
    // ricerca il comando
    a[n] = BLE_Serial.read();
    n += 1;
  }

  if (n > 0) setup_messages(1, true, a, n);

  Sim800l.listen();

il codice utilizza le seguenti librerie:

#include <EEPROM.h>
#include <TinyGPS++.h>
//#include <SoftwareSerial.h>
#include <Sim800l.h>
#include <Wire.h>

funziona tutto correttamente, nel senso che esegue tutti i comandi richiesti (tranne uno che poi a seguire vi spiego). Nella riga finale c'è l'istruzione Sim800l.listen();

questa istruzione non esiste nella libreria originale sim800l quindi mi sono avventurato a modificarla... ma qui vengono i problemi.

la modifiche ho fatto è la seguente:

file cpp

#include "Arduino.h"
#include "Sim800l.h"
#include <SoftwareSerial.h>

SoftwareSerial SIM(RX_PIN,TX_PIN);
//SoftwareSerial BLe(6, 7);
//String _buffer;


void Sim800l::listen(){      // >>>>>> NUOVA funzione <<<<<<<<
 SIM.listen();
}


//
//PRIVATE METHODS
//
String Sim800l::_readSerial(){
  _timeout=0;
  while  (!SIM.available() && _timeout < 12000  ) 
  {
    delay(13);
    _timeout++;


  }
  if (SIM.available()) {
 return SIM.readString();
  }
  
}


//
//PUBLIC METHODS
//


void Sim800l::signalQuality(){
/*Response
+CSQ: <rssi>,<ber>Parameters
<rssi>
0 -115 dBm or less
1 -111 dBm
2...30 -110... -54 dBm
31 -52 dBm or greater
99 not known or not detectable
<ber> (in percent):
0...7 As RXQUAL values in the table in GSM 05.08 [20]
subclause 7.2.4
99 Not known or not detectable 
*/
  SIM.print (F("AT+CSQ\r\n"));
  //String temp="";  
  //temp=_readSerial();
  //BLe.print (temp);
  //Serial.print(temp);
  //Serial.println("....Fatto");
  Serial.print(_readSerial());
}

mentre nel file h:

class Sim800l 
{ 
  private:
 int _timeout;
 String _buffer;
 String _readSerial();
   
   
  public:

 void begin(); 
 void reset(); 
 void listen();  // <<<<<<<<<<< NUOVA

sono andato ad intuito perché non l'ho mai fatto e non sono molto esperto. Però la funzione listen funziona correttamente.

Allora vi spiego adesso il problema. Chiaramente per poter utilizzare li modulo BLE, utilizzo un termianle, una app da iphone che ci chiama BLE terminal. Impostato tutto come ASCII invio e ricevo testo e tutto funziona.

se guardate al codice della funzione signalQuality(), così come è impostata adesso funziona correttamente e mi restituisce il segnale sulla seriale che leggo dal monitor.
Qui iniziano i problemi ed io non mi sento onestamente così esperto per risolvere il problema da solo e vi chiedo una mano (ed anche scusa in anticipo che ho fatto una stupidaggine).
Ho un comando che viene inviato dal terminale e letto correttamente che dovrebbe rispondere con la letture del segnale del GSM (per essere sicuro che prende...) e dovrebbe restituirlo sulla seriale software nuova, per fare questo ho modificato la libreria però questa volta senza successo. Non scrive niente e non si blocca neanche.

Ho fatto le seguenti cose per capire come ho modificato.:

  1. creato nella libreria una dichiarazione di nuova seriale (nel codice la vedrete esclusa ma solo perché l'ho lasciata come originale per installarla...):
    SoftwareSerial BLe(6, 7); // che è una copia di quella nel programma principale perché usa gli stessi pin ma si chiama diversamente

  2. poi ho provato a modificare la funzione signalQuality() provando a sostituire il comando:
    Serial.print(_readSerial()); con il comando BLe.print(_readSerial());

e questo non ha funzionato.

  1. poi ho provato ad assegnare ad una variabile temp il risultato del_readSerial()) e stamparlo sia sulla seriale sia su Ble. Nel prima caso funziona nel secondo no.

Spero di aver descritto bene il problema. Praticamente la seriale dichiarate nella libreria sembra non funzionare.... , gli stessi pin sono utilizzati nel programma principale per un altra seriale cihamata BLE_Serial.... non sono esperto ma le cose potrebbero entrare in conflitto? Non so, ma non mi è chiaro come risolvere.

Allora, ho pensato, leggendo un pò come si costruisce una libreria, che posso modificare la void signalQuality() in una funzione che restituisce una string: potrebbe funzionare? Così non ho bisogno della doppia seriale...

String Sim800l::signalQuality(){
/*Response
+CSQ: <rssi>,<ber>Parameters
<rssi>
0 -115 dBm or less
1 -111 dBm
2...30 -110... -54 dBm
31 -52 dBm or greater
99 not known or not detectable
<ber> (in percent):
0...7 As RXQUAL values in the table in GSM 05.08 [20]
subclause 7.2.4
99 Not known or not detectable 
*/
  SIM.print (F("AT+CSQ\r\n"));
  _buffer=_readSerial();
  return _buffer;
}

a questo punto nel main loop la parte che chiama questa funzione e stampa sulla seriale software potrebbe essere questa? (o devo usare write...)

        //Sim800l.signalQuality();
        BLE_Serial.println(Sim800l.signalQuality());

questo sarebbe il comando da eseguire quanto invio dall'iphone il codice 20... invece di invocare una void della libreria e dentro fare la stampa sulla seriale software che non funziona la faccio esternamente.
Non so se mi sono spiegato.

[off topic=on]
Lo provo quando torno a casa, perché io sono uno dei fortunati che fa un lavoro "essenziale" in azienda.
[off topic=off]

Funziona.

Mi sa che la doppia seriale con gli stessi pin è una stupidaggine. Ma non sono espertissimo.