Problema invio dati numerici su seriale

devo far spegnere un led ad arduino quando riceve il numero 1 , ma non avviene perchè?

void setup(){
Serial.begin(9600);
Serial.flush();
pinMode(13,OUTPUT);
}
int a;
void loop(){
digitalWrite(13,HIGH);
 if( Serial.available()>0 ){

    a= Serial.read();
    if(a==1){
    digitalWrite(13,LOW);
    }
 }

}

tutto questo è collegato ad un app fatta in c# che funziona perchè quando do avvia la lucina rx lampeggia , e comunque anche se glielo do dall'compilatore di arduino quel controllo non lo fa anche se gli arriva 1

Ciao

Dopo il
a= Serial.read();
mettici un
Serial.println(a, DEC);
così sul terminale seriale ti ritorna quello che hai inviato e riesci a capire cosa riceve il tuo Arduino.

ci avevo gia provato e in effetti ritona l’uno , ma comunque arduino non fa il controllo

Sicuro che sia il NUMERO uno ovvero 0x01 e non il CARATTERE uno, ovvero 0x31 ???

Guglielmo

io ho dichiarato che a è int quindi dovrebbe essere un numero

No, non è quello non conta, conta come lo trasmetti dal lato TX ... e, secondo me, glie lo trasmetti come carattere ... prova un po' a fare :

if (a == 0x31) {

e vedi se cambia qualche cosa ... :roll_eyes:

Guglielmo

gia provato non va

... allora l'unica è :

a = Serial.read();
Serial.println(a, HEX);

... così vediamo esattamente cosa ti arriva ;)

Guglielmo

ho gia provato e mi arriva l'uno ma non funziona lo stesso , arduino non fa il controllo

qwertyroby: ho gia provato e mi arriva l'uno ma non funziona lo stesso , arduino non fa il controllo

Emmm ... protesti dirmi [u]ESATTAMENTE[/u] cosa ti scrive sul monitor se tu metti le seguenti istruzioni :

char a;
....
if ( Serial.available() ) {
   a = Serial.read();
   Serial.print("Ricevuto : ");
   Serial.println(a, HEX);
}

... altrimenti non facciamo molti passi avanti ... :roll_eyes:

Guglielmo

Scusa @Guglielmo ma sbaglio o il codice è errato. Se per caso arriva il numero lui spegne il led ma nella loop() all'inizio lo riaccende immediatamente :fearful:

nid69ita: Scusa @Guglielmo ma sbaglio o il codice è errato. Se per caso arriva il numero lui spegne il led ma nella loop() all'inizio lo riaccende immediatamente :fearful:

VERO ... :grin: :grin: :grin:

Anche se andasse ... non se ne accorgerebbe ... XD XD XD

Occhio di lince eh Nid !!! XD

Guglielmo

ho corretto il codice cosi

void setup(){
Serial.begin(9600);
Serial.flush();
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
}
int a;
void loop(){

 if( Serial.available()>0 ){

    a= Serial.read();
    Serial.println(a, DEC);
    if(a==49){
    digitalWrite(13,HIGH);
    }
 }

}

la cosa strana e che in input quando gli do 1 mi da 49 output e se non sbaglio significa 1 in ascii , quindi gli input seriali li prende in char . posso prenderli in integer gli input??

Non è come li prende .. lui li prende come arrivano ... è dall'inizio che ti dico che dipende da chi trasmette cosa viene trasmesso ;)

Guglielmo

qwertyroby: la cosa strana e che in input quando gli do 1 mi da 49 output e se non sbaglio significa 1 in ascii , quindi gli input seriali li prende in char . Posso prenderli in integer gli input??

Di base si trasmette in caratteri. Anche se spedisci 123 come cifra di solito spedisci carattere '1' (ascii 49) poi '2' e poi '3'. Probabilmente da C# spedisci in modalità testo (ascii). Potresti spedire in binary o raw (byte) ma non sò se ti conviene. Potresti spedire in "un colpo solo" valori tra 0 e 255 (un byte) valori maggiori richiedono più byte e c'e' l'ambiguità del segno. Ovvero quando ricevi un byte lo consideri tra 0-255 oppure +127-127 (esempio 130 è +130 o -2) Quale comando usi in C# per spedire?

@qwertyroby: usiamo dei titoli consoni... "aiuto dove sbaglio?" che vuol dire? che spiega? ;)