Go Down

Topic: Switch () che non funziona (Read 132 times) previous topic - next topic

lelebum

Dopo il post di Standardoil sembra proprio che vi prenda in giro, eppure ho perso ore ed ore e non ne vengo a capo.

Ho connesso un SIM800L ad un MEGA2560 tramite la Serial1.
Al momento ho evitato di utilizzare la sua libreria giusto per vedere se riesco a farcela da solo e fare un pò di pratica con le stringhe.

Sulla arrays RxBuf si trovano le stringhe in arrivo dal modem, con FindGsmCmd, tramite l'header dei vari comandi, li indicizzo da 0-2, quindi li passo allo switch per specifiche azioni.

Tutto funziona per gli indici 0 e 1, ma non per l'indice 2.
Ho disseminato il codice di ".print" di debug ma non è servito a niente.
Anche se il comando   "SrlCmd.println(pippo);" posto a monte dello switch indica il n.2, di fatto il       "SrlCmd.println(F("Visualizza sms"));" posto nel "case 2:" non genera il messaggio.

Probabilmente sono cotto e non vedo il problema


Code: [Select]


char* pntStart;          // puntatore stringa temp
char* pntEnd;            // puntatore stringa temp

#define nCmd 2   // n. comandi modem
#define CmdCLIP 0
#define CmdCMTI 1
#define CmdCMGR 2   
char *GsmCmd[] = {"+CLIP","+CMTI:","+CMGR:"};

byte FindGsmCmd(){   // ritorna l'indice del comando 0-2 (3=non trovato)
  byte n;
  for ( n=0; n <= nCmd; n++){
    SrlCmd.println(GsmCmd[n]);
    pntStart = strstr(RxBuf, GsmCmd[n]);  // cerca comando
    if(pntStart != NULL) break; 
  }// for
 
  SrlCmd.println(n); 
  return n;
}// FindGsm..


//--------------------------------------------------------------

void Gsm(){           
 
  byte pippo=FindGsmCmd();
 
  SrlCmd.print("Pippo ");
  SrlCmd.println(pippo);

  switch (pippo) {
    case CmdCLIP:    // Chiamata voce
      // +CLIP: "+39338xxxxxxx",145,"",0,"",0gr
      pntStart += 8;                    // punta inizio numero
      pntStart[13] = 0;                 // def. fine stringa del numero
      if(FindTelefoni(pntStart)) SrlCmd.println(F("Telefono abilitato"));
      else SrlCmd.println(F("Sconosciuto"));
      break;
 
    case CmdCMTI:    // +CMTI  notifica sms
      // "+CMTI: "SM",5         
      char SmsInd[] = "A\0";
      SmsInd[0] = pntStart[12];       // salva indice sms

      // genera comando per stampa sms
      SrlGsm.print(F("AT+CMGR=")); // visualizza sms
      SrlGsm.print(SmsInd);        // out indice
      SrlGsm.print("\r");          // car return 
      break;
         
    case 2:   //CmdCMGR:  // +CMGR  stampa sms
      SrlCmd.println(F("Visualizza sms"));
      //GsmSmsPrint();     
      break;
   
    default:
      break;
  } //switch
       
} //void Gsm()




Standardoil

Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

pgiagno

Subito prima di "  switch (pippo) {" prova a inserire un brutale "pippo = 2;"

Ciao,
P.

lelebum

Quote
quale post mio?

Mi riferivo al post "AiutateCi ad aiutarVi"



Quote
Subito prima di "  switch (pippo) {" prova a inserire un brutale "pippo = 2;"

Fatto!
In ogni caso "SrlCmd.println(pippo);" conferma il dato, nel "case" all'etichetta ho sostituito "2".

Certi comportamenti del codice me li sono ritrovati utilizzando "String" e proprio per questo adesso sono passato "string.h", ma senza che le cose non sono cambiate.
Vedrò con calma le varie dichiarazioni a livello generale se ho sbagliato qualcosa.   




Standardoil

Controllo a che non sia un problema della funzione richiamata
Perché quello switch va bene
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

lelebum

Purtroppo ho controllato tutto, compreso il dump del buffer ma senza alcun problema.

Comunque è fatto innegabile che se all'ingresso "pippo" è =2 e il print presente al "case 2:" dovrebbe stampare il relativo messaggio di debug.
Poco importa che l'esecuzione del successivo codice "GsmSmsPrint()" non funzioni, ma il messaggio deve apparire.

Temo che dovrò rivedere le mie conoscenze sulle stringhe e trovare il problema.

Qualche tempo avevo scaricato dalla rete di un noto sito un Webserver x Arduino che utilizzava funzioni "String".
Se lo eseguivo come da origine tutto funzionava, appena inserivo un semplice comando per ricavare la posizione di un parametro il codice ritornava dati incoerenti.
Nemmeno lo sviluppatore, da me interpellato, è riuscito a capire l'origine.

Standardoil

Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

lelebum

Risolto il problema!

Ho spostato "char SmsInd[]  = "A\0";" nell'area globale, fuori della void.
Visto che operavo sulla variabile tramite puntatori probabilmente la cosa risulta incompatibile?


Approfitto del momento per chiedere un'informazione sull'uso delle schede dell'IDE.
Quando il programma comincia ad avere varie funzionalità in genere preferisco scrivere il codice in schede specifiche. Oltre al codice, raccolto nelle varie "void", in testa alla pagina vado a definire anche le variabili globali collegate.
E' corretta questa modalità o è preferibile raccogliere tutte le variabile globali nella scheda principale?

Grazie di tutto



Go Up