No entiendo una parte del código

Buenos días,

No tengo mucha experiencia en esto de programar Arduino (poca también con otros tipos de programación :slight_smile: ), por lo que muchos conceptos que supongo serán básicos no los acabo de comprender.

Mi duda es acerca de una función en la que hay un número entre paréntesis. Esta función está definida y es la siguiente:

void trama2serie(int a[])
{
  int i;
  for(i=0;i<(5+a[1]);i++){
     Serial.print(a[i],DEC);
     Serial.print(" ");
  }
     Serial.print("\n");
}

Si alguien pudiese explicarme un poco qué es lo que hace esta función se lo agradecería, pero creo que con esta parte no tengo problema ya que lo entiendo más o menos. Mi duda real es con el siguiente código:

if (puertoMon.available() > 0) {
    for (s = 0 ; s < 2; s++) {
      if (EsperarDato(2)) {
        goto inicio;
      }
      trama[s] = puertoMon.read();
    }
    for (t = 2; t < 5 + trama[1]; t++) {
      if (EsperarDato(2)) {
        goto inicio;
      }
      trama[t] = puertoMon.read();
    }
    trama2serie(trama);

Como veis, utiliza la función EsperarDato(2). El puertoMon es un puerto half duplex de software. Utiliza este puerto para leer datos que llegan y la función EsperarDato() para poder leerlos y ordenarlos.

Mi duda es sobre el significado del 2 entre paréntesis. He llegado a la conclusión de que es el número de bytes que espera, pero no estoy del todo seguro que sea correcto.

Un saludo a todos y muchas gracias de antemano.

Esta todo muy bien pero porqué no pones todo el código para comenzar?
En ningún lugar se lee que hace Esperar(algo) entonces solo podemos imaginarnos que es como un delay().

El programa puede funcionar pero te aseguro que lo que veo no me parece algo bien hecho. Para comenzar el uso de goto no es muy habitual en la programación en C. Eso es un arrastre de la programación que usa Basic.

Una rutina de lectura del puerto Serie de tramas de datos no requiere de algo tan intrincado como lo que has mostrado en el segundo código.

Aquí está la función EsperarDato(algo)

bool EsperarDato(byte origen) { //origen 1 = Serial, origen 2 = puertoMon
  bool recibe = false;
  unsigned long tiempo = millis();
  if (origen == 1) {
    while (!recibe) {
      if (Serial.available() > 0) {
        recibe = true;
      }
    }
  } else if (origen == 2) {

    while (!recibe) {
      if (puertoMon.available() > 0) {
        recibe = true;
        return false;
      }
      if (tiempo + 4 <= millis()) {

        //Serial.println("TIEMPO");
        return true;
      }
    }
  }
}

Sinceramente yo tampoco entiendo esos goto, el código no es mío y si lo quito deja de funcionar, por eso lo he dejado. No entiendo qué quiere decir esas dos condiciones, si no hacen nada.

Aquí dejo la función a ver si alguien puede resolverme la duda.