Conversion de Array de int a un int

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

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]);
    }
  }
}

Puedes hacer algo así

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,

data[i] - 48

lo encerré entre paréntesis para mayor claridad

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

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.

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

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.

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

Son enfoques.

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

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

Saludos

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.

Si, y estamos todos desenfocados. :rofl:

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... :man_facepalming:t2: