MODULO BLUETOOTH RN42

Ciao a tutti,

Non capisco dove sto sbagliando. Ho un mudolo RN42 connesso via SoftSerial ad Arduino Nano ed utilizzo la Serial (hardware) collegata al monitor. Il software è semplicemente pass trought tra la serial-softserial. Utilizzando il monito di arduino riesco ad inviare i comandi di configurazione al modulo RN42 senza problemi. Se però facci inviare gli stessi comandi da Arduino il modulo non si connette mai. Ho anche notato una cosa strana, quando invio manualmente il comando al modulo RN42 tipo: SM,1 (configurati come master), il modulo risponde AOK come da specifica se invece lo stesso comando lo invio con Arduino con le istruzioni:

SoftSerialBT.println("SM,1"); // Define this Module as Master

risposte in modo strano: ⸮AOK

che diavolo è quel punto di domanda rovesciato?

grazie per l'aiuto

A che velocità stai facendo lavorare la SoftwareSerial ?

Guglielmo

Ciao Guglielmo,
la Softserial viaggia 9600 ho configurato GPIO4=Hi per andare a 9600

Ok ... 9600 è una velocità che non da problemi con la SoftwareSerial ... prova a mettere il programma di prova con cui stai verificando l'anomalia (...mi raccomando, in conformità al regolamento, punto 7, il codice va racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

Ciao

Qui il codice di una piccola funzione che utilizzo per leggere le risposte che il modulo ritorna su invio comanda da host, mi servirebbe una review per capire se ho fato bene.

a questa funzione passo due parametri. il primo è una stringa rappresenta la risposta che mi attendo dal modulo ed il secondo è un int che rappresenta il time out che deve attendere. Detto diversamente se non ricevo entro timeout smetto di leggere la seriale ed invio un codice di timeout scaduto

void ReadBT(String ans, int time_out) //Read the BT answer from UART
{
  char c;
  int timeout=0;
  String stringa="";
  boolean findit=false;
  
  while ((timeout!=time_out) && (findit!=true))  {
    delay(1);
    if(SoftSerialBT.available()>0) {
          c = SoftSerialBT.read();
          stringa+=c;
          if (stringa==ans) findit=true;
          } 
    else timeout++;
        
  }//while      
  
  if (findit==true) Serial.println(stringa);
      else
          {
            Serial.print("BT_Timeout-> ");
            Serial.println(stringa);
          }
   
}//ReadBT

A parte che la classe String, su una piccola MCU come quella di Arduino, sarebbe da evitare come la peste, comunque a parte ciò, l'unica cosa che mi viene in mente che tu, ad inizio della ricezione, potresti trovare caratteri che NON hai letto dalla ricezione precedente ...

Esempio, se la stringa che ti aspetti, si conclude con un CR, tu riconosciuta la stringa esci, ma al prossimo giro, come prima cosa, nel buffer della seriale ti trovi il vecchio CR della trasmissione precedente ... ::slight_smile:

Guglielmo