# Trasferire variabili a 4 cifre tramite software serial

**URL:** <https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264>\
**Category:** Software\
**Created:** [July 14, 2021, 6:37pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264 "2021-07-14T18:37:22Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![Chris301197](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/chris301197/32/453011_2.png) [@Chris301197](https://forum.arduino.cc/u/Chris301197)\
**Post date:** [July 14, 2021, 6:37pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/1 "2021-07-14T18:37:22Z")

</div>

Salve a tutti, ho bisogno di trasferire un numero a 4 cifre tramite software serial. Attualmente so che il comando mySerial.write() mi da il valore raw ma mi da problemi dalla terza cifra in poi, mentre mySerial.print() mi da le 4 cifre in formato Ascii, ma non so convertirle in un intero sulla scheda arduino ricevente.  
Per mandare variabili uso un esp8266 con libreria apposita, mentre per riceverle, uso un arduino con libreria nativa.  
Grazie mille a chi mi aiuterà 😘

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [July 14, 2021, 7:05pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/2 "2021-07-14T19:05:35Z")

</div>

Un modo potrebbe essere ricevere i valori ascii e metterli nell'ordine corretto dentro un array di char, aggiungere in fondo il terminatore di stringa e poi con la funzione atoi() convertire in intero.

---

<div class="post-metadata">

**Author:** ![Chris301197](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/chris301197/32/453011_2.png) [@Chris301197](https://forum.arduino.cc/u/Chris301197)\
**Post date:** [July 14, 2021, 7:50pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/3 "2021-07-14T19:50:43Z")

</div>

Avrei una domanda riguardo l'array. Dopo un certo numero di variabili inviate, avrò problemi di riempimento del buffer? Oppure ho informazioni sbagliate?

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [July 15, 2021, 6:13am UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/4 "2021-07-15T06:13:01Z")

</div>

Di che buffer parli?  
L'array di ricezione o il buffer della seriale?

---

<div class="post-metadata">

**Author:** ![cotestatnt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/cotestatnt/32/238781_2.png) [@cotestatnt](https://forum.arduino.cc/u/cotestatnt)\
**Post date:** [July 15, 2021, 9:16am UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/5 "2021-07-15T09:16:08Z")

</div>

> [@Chris301197](#):
>
> bisogno di trasferire un numero a 4 cifre

Non è una questione di cifre...  
`Serial.write()` trasmette un byte per volta.  
Un byte è formato da 8 bit, quindi con questo tipo di dati puoi rappresentare fino a 2^8 numeri.

Se parliamo di interi positivi significa da 0 fino a 255.  
Per rappresentare un numero superiore (e quindi anche quelli con 4 cifre come dici tu) hai bisogno di due byte.

In questo forum se cerchi ci sono minimo 3/4 post che trattano questo argomento (solo nella sezione italiana, in quella internazionale forse ancora di più).

---

<div class="post-metadata">

**Author:** ![Chris301197](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/chris301197/32/453011_2.png) [@Chris301197](https://forum.arduino.cc/u/Chris301197)\
**Post date:** [July 15, 2021, 10:54am UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/6 "2021-07-15T10:54:29Z")

</div>

Ho letto in giro che il buffer di ricezione ha una capacità massima che se riempita non posso più eseguire il comando serial.write(). So anche che la scheda ricevente deve salvare un array di caratteri da convertire in intero, ma poi, salvando sempre gli array uno dopo l'altro, avrò bisogno di svuotare il buffer di ricezione prima o poi?

---

<div class="post-metadata">

**Author:** ![cotestatnt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/cotestatnt/32/238781_2.png) [@cotestatnt](https://forum.arduino.cc/u/cotestatnt)\
**Post date:** [July 15, 2021, 11:30am UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/7 "2021-07-15T11:30:20Z")

</div>

> [@Chris301197](#):
>
> Ho letto in giro

O hai letto male oppure hai letto delle stupidaggini.

Il buffer la seriale se lo gestisce da se, non devi svuotare nulla.

Quanto al passaggio **numero - stringa - numero** per funzionare funziona, ma io lo trovo un'inutile spreco di risorse e cicli di clock.

---

<div class="post-metadata">

**Author:** ![Chris301197](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/chris301197/32/453011_2.png) [@Chris301197](https://forum.arduino.cc/u/Chris301197)\
**Post date:** [July 15, 2021, 12:10pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/8 "2021-07-15T12:10:52Z")

</div>

Purtroppo sul forum ho trovato solo questo, consigli qualcosa?

---

<div class="post-metadata">

**Author:** ![cotestatnt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/cotestatnt/32/238781_2.png) [@cotestatnt](https://forum.arduino.cc/u/cotestatnt)\
**Post date:** [July 15, 2021, 4:16pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/9 "2021-07-15T16:16:47Z")

</div>

Se ne era discusso in passato [qui](https://forum.arduino.cc/t/ricevere-e-salvare-dati-via-seriale-da-una-union/850210/19). Nello specifico si usava una struct per trasmettere in un colpo solo tutta una serie di valori.

Poi ho trovato anche [questa](https://forum.arduino.cc/t/elaborare-in-ricezione-2-valori-float-in-seriale/670245/18) discussione simile, dopo mi sono fermato.

Se hai esigenze più "semplici" puoi usare direttamente i metodi inclusi con la classe **Serial** (derivati da Stream) ed usare il **Serial.print()** invece di write().  
Ad esempio nel tuo caso ti basterebbe questo  
[Serial.parseInt() - Arduino Reference](https://www.arduino.cc/reference/en/language/functions/communication/serial/parseint/)

```cpp
......
if(Serial.available()) {
  // in value viene memorizzato il primo intero valido ricevuto dalla seriale.
  int value = Serial.parseInt();
  if (value != 0) {
    Serial.print("Ricevuto valore intero ");
    Serial.println(value);
  }
}
.....

```

Eventualmente potresti "irrobustire" un po' il protocollo aggiungendo una intestazione che ti consente di discriminare quale valore stai ricevendo.  
Se sulla seriale del TX scrivi una cosa del genere:

```cpp
Serial.print("Value1: ");
Serial.prinln(val1);
Serial.print("Value2: ");
Serial.prinln(val2);

```

Lato RX potresti fare cosi:

```cpp
int value1, value2;
......
if(Serial.available()) {
  // Scorre tutto lo stream seriale fino a trovare "Value1"
  if(Serial.find("Value1") {
    // in value1 viene memorizzato il primo intero valido ricevuto dalla seriale subito dopo la substring "Value1"
    int value1 = Serial.parseInt();  
    if (value1 != 0) {
      Serial.print("Ricevuto valore intero ");
      Serial.println(value1);
    }
  }

  if(Serial.find("Value2:") {
    int value2 = Serial.parseInt(); 
     // in value2 viene memorizzato il primo intero valido ricevuto dalla seriale subito dopo la substring "Value2"
    if (value2 != 0) {
      Serial.print("Ricevuto valore intero ");
      Serial.println(value2);
   }
  }

}
.....

```

Io non amo molto questo metodo perché non è il massimo dell'efficienza, però funziona ed è abbastanza semplice da implementare.

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [July 15, 2021, 8:17pm UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/10 "2021-07-15T20:17:34Z")

</div>

Concordo con @cotestatnt che il metodo della print con i valori ascii è più macchinoso di altre soluzioni, forse però è più semplice da capire se l'OP non ha ben chiaro tutto il meccanismo.  
Poi concordo anche che un minimo di protocollo non guasta.

---

<div class="post-metadata">

**Author:** ![Chris301197](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/chris301197/32/453011_2.png) [@Chris301197](https://forum.arduino.cc/u/Chris301197)\
**Post date:** [July 16, 2021, 6:48am UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/11 "2021-07-16T06:48:05Z")

</div>

Ho letto la documentazione di parseInt, sembra interessante, proverò e vi faccio sapere.

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 13, 2021, 6:48am UTC](https://forum.arduino.cc/t/trasferire-variabili-a-4-cifre-tramite-software-serial/885264/12 "2021-11-13T06:48:52Z")

</div>

Closed on November 13, 2021, 6:48am UTC

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.
