# Conversion de Array de int a un int

**URL:** <https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613>\
**Category:** Software\
**Created:** [August 31, 2022, 9:49pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613 "2022-08-31T21:49:38Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![octissj](https://avatars.discourse-cdn.com/v4/letter/o/7c8e57/32.png) [@octissj](https://forum.arduino.cc/u/octissj)\
**Post date:** [August 31, 2022, 9:49pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/1 "2022-08-31T21:49:38Z")

</div>

Tengo una comunicacion serial entre un Arduino mega y un Esp8266 el cual mediante un servidor NTP obtiene la hora.

El arduino mega el enviarle por comunicacion Serial1 un 2 obtiene esa variable del esp8266 que son los milisegundos desde 1970 hasta la actualidad ( epoch )

mi problema es q lo obtengo como un array a cada bit en codificacion ascii, queria saber una manera de convertir ese array a un solo numero para con el cual trabajar con TimeLib y obtener la fecha y hora actual. ej: {49, 50, 51, 52} -\> 1234

```cpp
void setup() {
  Serial1.begin(115200);
  Serial.begin(115200);
  while (!Serial1) {
    ;
  }
}

void loop() {
  if (Serial.available()) {
    int data = Serial.read();
    if (data == 10) return; //ignorar el salto de linea \n
    if ( data == 49)// si se envia un 1 por consola obtener la hora{
      obtenerHora();
    }
  }
}

long obtenerHora() {
  Serial1.print(2);
  if (Serial1.available()) {
    char data[Serial1.available()];
    for (int i = 0; i < Serial1.available(); i++) {
      data[i] = Serial1.read();
      if(data[i] == 10) continue; // si el bit obtenido es \n (salto de linea) ignorar
      Serial.print(data[i]);
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [August 31, 2022, 11:12pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/2 "2022-08-31T23:12:02Z")

</div>

Puedes hacer algo así

```cpp
int dataLen = sizeof(data)/sizeof(data[0]); // cantidad de items del array
int numero = data[0] - 48;
if(dataLen > 1) {
  for(byte i = 1; i < dataLen; i++){
    numero = numero * 10 + (data[i] - 48);
  }
}
Serial.println(numero);

```

Como 48 es el código ASCII de '0', restando 48 al dígito obtienes el valor decimal que representa.  
Lo demás se explica solo (creo...)

Saludos

PD: Aunque matemáticamente no es necesario,

```cpp
data[i] - 48

```

lo encerré entre paréntesis para mayor claridad

---

<div class="post-metadata">

**Author:** ![Surbyte](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/surbyte/32/217404_2.png) [@Surbyte](https://forum.arduino.cc/u/Surbyte)\
**Post date:** [August 31, 2022, 11:21pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/3 "2022-08-31T23:21:44Z")

</div>

> [@octissj](#):
>
> ```arduino
> long obtenerHora() {
> Serial1.print(2);
> if (Serial1.available()) {
> char data[Serial1.available()];
> for (int i = 0; i < Serial1.available(); i++) {
> data[i] = Serial1.read();
> if(data[i] == 10) continue; // si el bit obtenido es \n (salto de linea) ignorar
> Serial.print(data[i]);
> }
> }
> }
> 
> ```

Porque repites tantas veces Serial.available() no es necesario mas que una vez!!

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [September 1, 2022, 12:07am UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/4 "2022-09-01T00:07:58Z")

</div>

Lo está usando para conocer la cantidad de caracteres en el buffer por eso lo usa varias veces.  
Lo correcto sería que lo guarde en una variable y trabaje con ésta, claramente.  
Además, usarla como límite de _for()_, no se si es buena idea ya que se supone que _available()_ se decrementa con cada _read()_ y podría generar problemas.

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [September 1, 2022, 12:25am UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/6 "2022-09-01T00:25:09Z")

</div>

> [@octissj](#):
>
> como sugieres hacerlo?

```arduino
int longitud;
if(Serial1.available() > 0){
  longitud = Serial1.available();
  char data[longitud];
  for (int i = 0; i < longitud; i++) { 
// lo que sigue

```

---

<div class="post-metadata">

**Author:** ![Surbyte](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/surbyte/32/217404_2.png) [@Surbyte](https://forum.arduino.cc/u/Surbyte)\
**Post date:** [September 1, 2022, 5:43pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/7 "2022-09-01T17:43:11Z")

</div>

Esa respuesta ya la sabía @anon90500195.  
Le marco que es un abuso y que no hace falta 3 o mas veces usar Serial1.available()  
Incluso lo que propones puede mejorarse con uno solo.

```cpp
int longitud = Serial1.available();
int i = 0;
while (i < longitud) {
  char data[longitud];
  data[i] = Serial1.read();
  Serial.print(data[i]);
  i++;
}

```

Son enfoques.

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [September 1, 2022, 6:17pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/8 "2022-09-01T18:17:16Z")

</div>

> [@Surbyte](#):
>
> Incluso lo que propones puede mejorarse con uno solo.

Si, me di cuenta después que lo subí (al mejor cazador se le escapa una perdiz), pero no tenía ganas de editar. 🤣

Igual la idea era mostrarle a @octissj cómo podía hacerlo, para mejorar y depurar hay tiempo. 😉

Saludos

---

<div class="post-metadata">

**Author:** ![Surbyte](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/surbyte/32/217404_2.png) [@Surbyte](https://forum.arduino.cc/u/Surbyte)\
**Post date:** [September 1, 2022, 6:58pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/9 "2022-09-01T18:58:29Z")

</div>

Como dije, son enfoques. Esta bien usar 3 veces Serial.available() pues si, a quien le importa? El micro no dejará de funcionar por eso. Solo es para aprender.

---

<div class="post-metadata">

**Author:** ![anon90500195](https://avatars.discourse-cdn.com/v4/letter/a/a587f6/32.png) [@anon90500195](https://forum.arduino.cc/u/anon90500195)\
**Post date:** [September 1, 2022, 9:11pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/10 "2022-09-01T21:11:06Z")

</div>

> [@Surbyte](#):
>
> Son enfoques.

Si, y estamos todos desenfocados. 🤣

Probá cualquiera de los 2 códigos, imprimí el valor de _longitud_ y fijate lo que se obtiene.

Con qué facilidad olvidamos (y me incluyo) que _loop()_ se ejecuta miles de veces por segundo y que el Serial, en comparación, es muy lento.

Y ahí va otra perdiz... 🤦🏻‍♂️

---

<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:** [February 28, 2023, 9:12pm UTC](https://forum.arduino.cc/t/conversion-de-array-de-int-a-un-int/1027613/11 "2023-02-28T21:12:04Z")

</div>

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