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 :~
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..
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!
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...
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...
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