Salve a tutti, vorrei chiedere delle informazioni riguardo la trasmissione seriale.
Utilizzo 2 moduli xbee serie 1 collegati ad Arduino come nell'immagine allegata.
Allego gli sketch di prova.
Trasmettitore:
//TRANSMITTER
#define led 12
#define button 9
int stato;
void setup() {
// start serial port at 9600 bps
Serial.begin(9600);
pinMode(button,INPUT);
pinMode(led,OUTPUT);
}
void loop() {
stato= digitalRead(button);
if (stato==0) digitalWrite(led,HIGH);
else digitalWrite(led, LOW);
Serial.print(stato);
delay(300);
}
Ricevitore:
// RECIEVER
#define led 13
int stato;
//char incomingByte;
void setup() {
// start serial port at 9600 bps
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop() {
if (Serial.available()) {
stato= Serial.read();
Serial.println(stato);
delay(100);
if (stato==0) digitalWrite(led,HIGH);
}
}
Il fatto è che il led non si accenderà mai poiché lo stato non è mai 0, ma passa da 48 a 49
Se inserisco questa riga:
Serial.println(char(stato));
la lettura quando il pulsante è premuto diventa 0 (mettendo davanti char). Con quale formato di dati avviene la trasmissione delle informazioni??
La serial.print(), di default, trasforma i numeri in formato ASCII pertanto 0x00 diventa 48 e 0x01 diventa 49.
Hai due soluzioni possibili, in ricezione fai il confronto sul carattere ASCII 0, if (stato == '0'), oppure usi la serial.write(stato) che invia il byte reale e non la sua codifica in ASCII.
Ah.
Ho provato a fare quello che mi consigli facendo:
if (stato==48) stato=0;
Il tutto pero risulterebbe macchinoso se devo poter interpretare diversi numeri..
La differenza tra Serial.print e Serial.write é solo nella trasmissione? Serial.write lo leggo sempre con Serial.read?
Ciao,
sono alle prime risposte, quindi mi rimetto a pareri più esperti comunque per inviare delle lettere puoi confezionare delle stringhe di testo o dei singoli caratteri al posto della variabile stato.
Per esempio puoi scrivere in trasmissione
Serial.print("a");
oppure
Serial.print("D1=");
La seriale in ricezione la riceverà. Chiaramente il tipo di dato non è più un int, ma sarà uno string o un char. Attento a non comporre stringhe troppo lunghe perché poi ci vorrà un certo tempo per inviarle e riceverle... e anche la memoria sufficiente per gestirle. Mi sembra infine che gli xbee gestiscano pacchetti di max 100 caratteri per volta.
ciao
credo tu non abbia capito il consiglio di astrobeed.
Ho provato a fare quello che mi consigli facendo:
if (stato==48) stato=0;
Il tutto pero risulterebbe macchinoso se devo poter interpretare diversi numeri..
non devi fare quel cambio. Se scrivi
if(stato == '0')
confronti se stato è uguale al CARATTERE 0 (zero) senza fare nessun cambiamento.
Non c'è il modo di trasmettere delle lettere o dei numeri e utilizzare la funziona "case"?
Certo, sempre tramite la Serial.print e poi con lo stesso sistema di confronto:
switch (stato)
case 'a': // stato = carattere a
....
break;
case '2': // stato = carattere 2
....
break;
eccetera...
Da notare che si usano gli apici singoli per il confronto su caratteri.
Se ti servono dei valori interi corrispondenti al numero trasmesso puoi sottrarre 48 al valore di stato:
carattere valore ASCII valore -48
0 48 0
1 49 1
2 50 2
eccetera....