Conversione di un byte a int

Salve a tutti,

chi mi aiuta a capire come posso convertire un byte nel corrispondente valore intero?

in pratica scrivo ogni 3 secondi sulla seriale 1 che è collegata con la seriale con un cortocircuito fisico in modo che questo valore lo leggo sulla seriale 2 e lo visualizzo sulla seriale a cui è collegato l'usb trasmite il monitor seriale. Adesso io voglio prendere questo valore per riportarlo in un intero.

Qualcuno mi può aiutare?
grazie mille

void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
}

void loop() {
  // read from port 1, send to port 0: 
   time = millis();
   
   if(time - temp > 3000 ){
       randNumber = random(1000);
       Serial.print("valore generato ");  
      Serial.println(randNumber);  
       Serial1.print(randNumber);  
       temp = millis();  
   }
  
  
  if (Serial2.available()) {
    byte nro = Serial2.read();
    Serial.println(nro,BYTE);

  }
}

Da una parte lo stai inviando sotto forma dei caratteri che compongono la visualizzazione decimale del numero, dall'altra lo stai leggendo in binario. Ad esempio, se devi inviare 123, invii tre byte, ovvero quelli corrispondenti ai codici ASCII dei caratteri '1', '2' e '3', mentre dall'altra parte ti aspetti un unico byte, e nemmeno in codifica ASCII, per cui riceveresti tre numeri, nella fattispecie 49, 50 e 51, giusto? :slight_smile:

Per risolvere il problema devi inviare e ricevere in modo coerente, ad esempio inviando e ricevendo byte, sostituisci:

Serial1.print(randNumber);

con

Serial1.write(randNumber);

Questo è consigliato, perché almeno puoi inviare valori tra 0 e 255 con un solo byte. In alternativa, se preferisci usare l'ASCII, devi cambiare la parte di ricezione:

byte nro = Serial2.read();

deve diventare:

byte nro = Serial2.parseInt();

Insomma, se fai read() devi fare write(), se fai print() devi fare parseXXX().

grazie per la risposta ho provato a fare le modifiche che mi hai suggerito ma mi da il seguente errore:

sketch_provaseriali.cpp: In function 'void loop()':
sketch_provaseriali.cpp:30:24: error: 'class HardwareSerial' has no member named 'parseInt'.

Se invece di fare così, vorrei mandare un array contente i byte del numero che ho generato e poi li voglio ricostruire per mostrare un valore intero?

Che Arduino e che librerie stai usando ?

Devi spedire un intero nel senso di una variabile int ? Sono solo 2 byte, e devi spezzarla usando 2 write() , ma poi nella ricezione dovrai fare 2 read() e ricomporre il numero, usa lowByte() e highByte()

Ti devi quindi imparare a spezzare/ricomporre i dati in byte e lavorare con le operazioni sui bit. Ti conviene ?

non è proprio arduino, è chipkit max32 della digilent, per cui credo che parseInt() non lo posso fare ma devo ricostruire io l'intero

Stai comunque usando l'IDE di Arduino? Che versione?

E poi: devi mandare un BYTE o un INTERO?

è simile Mpide di maggio 2011. Devo inviare un intero solo quando vado a leggere vorrei leggere un intero non il valore ascii, non sono esperto purtroppo

Perdonami, ma forse se non usi né Arduino né il suo IDE, forse era il caso di specificarlo bene fin dall'inizio, dato che siamo su un forum di Arduino, non credi?

In ogni caso, non conosco MPIDE, per cui ritiro tutto tutto quanto detto sopra.

Si hai ragione scusami, ma molte cose sono uguali per questo ho scritto su questo forum e poi su arduino è più utilizzato

E’ l’IDE fermo alla versione 023 mi pare, ma PERFETTAMENTE compatibile. Sempre meglio postare il codice chissà che errore hai fatto.
Ho la chipKit Uno 32, codice compilato senza errori con la parseInt():

void setup() {          
  Serial.begin(9600);      
  pinMode(PIN_LED1, OUTPUT);     
}

void loop() {
  if(Serial.available())
  { int x=Serial.parseInt();
    int y=Serial2.parseInt();  // da errore se seleziono Uno32, no err se Max32
  }
  digitalWrite(PIN_LED1, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(PIN_LED1, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

Praticamente preistorico...

il codice era praticamente lo stesso di quello che ho postato quando ho aperto il post con le modifiche suggeritomi da SukkoPera

A me compila. A te ?

a me da questo errore:

sketch_oct22a.cpp: In function 'void loop()':
sketch_oct22a.cpp:29:24: error: 'class HardwareSerial' has no member named 'parseInt'

Grazie lo stesso ma ho risolto in questo modo

void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
  vettptr = &vett;

}

void loop() {
  // read from port 1, send to port 0: 
   time = millis();
   
   if(time - temp > 3000 ){
       randNumber = random(1000);
       dim = sizeof(randNumber);
       Serial.print("valore generato ");  
       Serial.println(randNumber);  
       
       Serial.print("dimensione dato:");  
       Serial.println(dim); 
       Serial1.println(randNumber);   
       temp = millis();  
   }
  
  
  if (Serial2.available()) {
    
     int nro = Serial2.read();
     vett = (char) nro;
     int nro1 = atoi (vettptr);  
     Serial.println(nro1);   
    }
  
}

ti volevo chiedere adesso voglio interfacciarmi con un dispositivo che ha un suo protocollo di comunicazione, per fare ciò devo creare un pacchetto per fare una richiesta e ottenere le informazioni desiderate?
Per esempio per richiedere la versione del firmware devo inviare un messaggio con l'id per fare quella richiesta?

?? :o
devi avere le informazioni di quel dispositivo. Se ha un suo protocollo accetterà dei "comandi" ma devi avere la documentazione.

Per la parseInt() amen, ma se a me compila e a te no, mi pare che il tuo MPIde non è l'ultima versione. Io fossi in te l'aggiornerei.

Si ha un suo protocollo proprietario stavo cercando prima di imparare qualcosa. senti un pò dovrei dare io l'inizio da seriale prima di fare spedire un messaggio avevo pensato di fare così:

 if (Serial.available() &&  digitalRead(Pin) == HIGH ){
 
    Serial.println  ("CIAO");
    digitalWrite(Pin,LOW);
 
 }

ma non mi funziona quando vado ad aggiungere altro codice se lo testo da solo va bene