Problema con NewSoftSerial

Salve ragazzi. Sto avendo problemi nel ricevere stringhe utilizzando arduino e newsoftserial. Il software che ho scritto è il seguente:

#include "NewSoftSerial.h"

NewSoftSerial mySerial(2, 3);

void setup()  
{
  mySerial.begin(4800);
}

void loop()                     // run over and over again
{

char buffer_x[5];
char c;
int i = 0;
   
while(1) {
   if (mySerial.available()) {
      c = (char)mySerial.read();
      if (c != '!')  {
        buffer_x[i] = c;
        i = i +1;
      }
      else {
        buffer_x[i] ='\0';
        i = i +1;
        break;
     }
      
   }

}
mySerial.println(buffer_x);

}

Ma non mi viene ristampato indietro la stringa che digito. La connessione funziona bene (con un altro sketch) se invio un solo carattere alla volta...

Dove sbaglio? Vi ringrazio per la infinita pazienza :~

voglio una sfera di cristallo!!!!1

Come e a cosa hai collegato la seriale nei 2 casi?

Ciao Uwe

Scusami, al normale pc con il monitor seriale di arduino!

I collegamenti penso siano a posto, perchè con un carattere singolo tutto funziona egregiamente. Penso sia solo una questione di codice(scritto da me) e direi sbagliato..

Potrebbe essere un problema dovuto al fatto che dichiaro un array di caratteri di dimensione 5, e la stringa può terminare prima con \0?

inizia a eliminare il break: pittosto usa variabile booleana nel controllo del while che setti a false quando hai finito di ricevere la stringa. sinceramente non vorrei che il break; uscisse solo dall'if e non dal while, anche se mi pare strano.

comunque l'uso del break è sconsigliatissimo, tranne che nello switch

In effetti non ho mai utilizzato il break nella normale programmazione per pc, ma pensavo sui microcontrollori fosse efficiente...

Proverò ad eliminarlo appena lo studio mi da tregua, ma non credo sia quello il problema perchè da quello che ho letto è supportato bene da arduino (almeno che non ci sia un bug clamoroso per cui non viene "letto" in un ramo else... Quindi ricapitolando:

#include "NewSoftSerial.h"

NewSoftSerial mySerial(2, 3);

void setup()  
{
  mySerial.begin(4800);
}

void loop()                     // run over and over again
{

char buffer_x[5];
char c;
int i = 0;
bool stop = 0;
   
while(stop == 0) {
   if (mySerial.available()) {
      c = (char)mySerial.read();
      if (c != '!')  {
        buffer_x[i] = c;
        i = i +1;
      }
      else {
        buffer_x[i] ='\0';
        i = i +1;
        stop = 1;
     }
      
   }

}
mySerial.println(buffer_x);

}

Preciso che ho sbagliato a scrivere: non utilizzavo putty ma il monitor seriale di arduino (impostando come porta seriale quella effettiva di trasmissione e selezionando come baud rate 4800), ma non penso cambi niente!

Allora hai collegato i pin 2 e 3 di Arduino ad un interfaccia (tipo RS232 o similare) alla COM1 (porta RS232fisica)? Ciao Uwe

Esattamente! Ho collegato i pin 2 e 3(in realtà poi dovrò utilizzare i pin 1 e 2 stando attento a non utilizzare la comunicazione usb nel frattempo, perchè ho tutti i pin pwm occupati) alla seriale del pc (COM1) e successivamente ho aperto il serial monitor di arduino sulla porta seriale COM1 (non ovviamente quella su cui programmo arduino, che è COM3), stando attento a settare 4800 come baud rate. Provo ad inviare una parola che termina con ! e non ricevo niente indietro... Se invece faccio uno sketch stupidissimo che legge un carattere e lo riscrive indietro allora funziona perfettamente, quindi penso che i collegamenti siano ok...

Ciao xelendilx

La seriale hardware é su pin0 e pin1.

mi ripeto: Sui pin 2 e 3 hai messo un traslattore di livello tra ttl e RS232 (tipico MAX232) ?

Ciao Uwe

Si scusami, ho sbagliato a scrivere, intendevo i pin rx e tx.

Sisi, seriale->max232->arduino, funzionano bene perchè i caratteri singoli li ricevo e me li reinvia correttamente. A questo punto penso che potrei anche utilizzare il serial hardware sulle porte tx ed rx, ma comunque il codice lo scriverei in questo esatto modo...

Poi c'è anche un modo un po' più stupido che mi è venuto in mente, che però dovrebbe funzionare.. Ossia quello di fare un controllo su mySerial.avalaible() ed in caso sia vero attendere tipo 100 ms che il buffer sia completamente carico e svuotarlo un carattere alla volta. Ma sinceramente non mi sembra una soluzione troppo scalabile...

I condensatori messi sul max232 son giusti?

Hai provato di usare la seriale-USB come test di controllo?

Ciao Uwe

Ti ripeto, tutto dovrebbe essere messo correttamente perchè quando invio un carattere singolo (con un altro sketch) lo riceve e lo reinvia correttamente… Penso sia solo un problema di codice :smiley: