Invio e ricezione seriale

Salve ragazzi,

vorrei usare arduino come scheda di acquisizione dati, ma allo stesso tempo avrei bisogno di inviare alla scheda comandi di "attuazione".

Ho caricato il seguente codice sulla board:

int inByte=255;

void setup()
{
pinMode(9, OUTPUT);
analogWrite(9,inByte);
Serial.begin(9600);
}

void loop()
{
if (Serial.available()>0)
{
inbyte=Serial.read();
analogWrite(10,inByte);
}
Serial.println(inByte);

}

Ora finchè uso processing, o minicom è tutto ok.. accendo e spengo il led e mi torna indietro il valore corrente di inByte.
Se uso matlab al primo dato inviato la scheda smette di inviare dati via seriale.
Qualcuno sa darmi una risposta?
(non sono interessato ad usare lo sketch di Matlab per arduino).

Su matlab c'è il seguente codice:

Seriale = serial('/dev/ttyUSB0');
set(Seriale,'BaudRate', 9600);
fopen(Seriale);

una volta aperta la comunicazione da command window lancio:
fscanf(Seriale);

ricevo il valore di inbyte ed i led sulla board lampeggiano.

appena invio
fwrite(Seriale,10);

il led cambia stato, ma in ricezione non leggo più nulla. La scheda continua a ricevere segnali in ingresso, ma non invia nulla.

Attendo vostre risposte!

Ciao ciao

void loop()
{
if (Serial.available()>0)
{
inbyte=Serial.read();
analogWrite(10,inByte);
}
Serial.println(inByte);
}

Cósí mandi l' ultimo dato ricevuto in una ricezione multipla (piú byte uno dopo l' altro) e la ripeti finche arriva un nuovo dato sulla seriale. È voluto?
Il LED lo hai messo sul pin 9 o sul pin 10 o su entrambi?
Ciao Uwe

Ciao Uwe,

ho incollato solo una parte del programma... ed ho sbagliato.. comunque è tutto sulla porta 9 comandata in pwm.
Il flusso continuo di dati in uscita dall'arduino è voluto.
Mettiamola così, facciamo che Serial.println(inByte) debba inviarmi dei dati rilevati da un trasduttore.
L'elaborazione dei dati prelevati dal trasduttore deve poi controllarmi l'accensione di un led.
Ora il codice postato non fa questo ovviamente, però rende l'idea delle prove fatte, e sopratutto dello scopo!

Grazie della risposta.
Sei sempre gentilissimo!

I comandi in arrivo dal PC sono a singolo byte o possono essere multibyte ?

nel primo caso è semplicissimo:

if ci sono caratteri disponibili
ch = leggi carattere
esegui il comando in base al carattere (usa l'istruzione switch)
endif

Per ogni comando previsto scrivi una funzione che lo esegue.

ciao tuxduino,

il problema è un'altro. La seriale si blocca nel momento in cui invio un dato.. non riesco a ricevere più dati da arduino.. riesco solo ad inviarglieli!

steeveO:
ciao tuxduino,

il problema è un'altro. La seriale si blocca nel momento in cui invio un dato.. non riesco a ricevere più dati da arduino.. riesco solo ad inviarglieli!

Se stai usando questo

void loop()
{
if (Serial.available()>0)
{
inbyte=Serial.read();
analogWrite(10,inByte);
}
Serial.println(inByte);
}

lo credo bene!

Apri il serial monitor e capirai... :slight_smile:

Se apro il serial monitor funziona tutto bene... è matlab che non funziona!