Cette instruction est-elle bloquante ?

Désolé, je ne vous comprends pas.

Mon traitement est dans une boucle, mais qui ne reviendra qu'après avoir fait d'autres choses. Je vais essayer d'être bref et précis.

Je mesure l'intensité solaire avec une cellule qui suit son mouvement en élévation et en azimut. Je fais une mesure toutes les quatre minutes. Ce processus est géré par un Mega2560.

Une fois la cellule positionnée, je lance l'ordre de mesure (via une liaison série) à un Pro mini qui lui, est chargé de faire la mesure. Celle-ci peut prendre du temps, mais inférieur à 3 secondes.

J'attends donc que le pro Mini me retourne ses mesures (via la liaison série). S'il y a défaillance, donc pas de softSerial.available(), je passe à la suite au bout de trois secondes.

Cela terminé, je mets à jour mes affichages dans le Mega, j'enregistre les valeurs dans une carte SD et j'attends les 4 minutes suivantes.

Voilà le morceau de code utilisé :

void DelaiSurNouvPoint(unsigned long t) { // Placer ici les instructions qui permettent de lire les capteurs
/*  orientePanneau(true); // Orientation au Sud et à 35° en élévation
  delay(500); // stabilisation après la rotation vers le Sud
  mesurePmax(&ptEnrg[0], &ptEnrg[1]);
  mesCourbes.ptCour[0] = ptEnrg[0]; // Affichage de la tension en mode Sud*/

  orientePanneau(false); // Orientation à l'Azimut et à la hauteur du soleil
  delay(500); // stabilisation après la rotation vers l'Azimut
  mesurePmax(&ptEnrg[2], &ptEnrg[3]);
  mesCourbes.ptCour[1] = ptEnrg[2]; // Affichage de la tension en mode Azimut

  edHauteur.affiche(dtostrf(ha, 4, 1, str)); // Affichage de la Hauteur
  edAzimut.affiche(dtostrf(az, 4, 1, str)); // Affichage de l'Azimut

  tPrec = t;
  if (uint32_t(t / dTemps) % DIV_AFF == 0)
    mesCourbes.majAff(); // déclenche la mise à jour de l'affichage
  if (enrgData.appuye) { // Si un enregistrement est demandé
    maSD.ouvreFichier(nomFch.texte + ".txt", 'E'); // ouvre la carte SD en mode Ecriture
    maSD.ecrit_DT_Data(&ptEnrg[0], dimPtEnrg); // affichage et enregistrement sur la SD de la date, de l'heure et des valeurs de ptEnrg
    maSD.fermeFichier(); // termine l'enregistrement sur la carte SD
  }
}

void mesurePmax(float *vMax, float *iMax) {
  Serial3.setTimeout(1000);
  char buff[4];
  Serial3.write('M'); // Demande de mesure
  uint32_t t0 = millis();
  while(!Serial3.available() && millis()-t0 < 3000) {} // On attend d'avoir un retour ... ou pas
  if (Serial3.available()) { // si le pro mini répond
    String strVI = Serial3.readStringUntil('#'); // Lecture du retour de mesure
    Serial3.setTimeout(10);
    Serial.println(Serial3.readBytes(buff, 4)); // pour supprimer les octets qui trainent !
    *vMax = strVI.substring(1, 13).toFloat();
    *iMax = strVI.substring(15, 27).toFloat();
  }
}

Si vous voyez comment se passer de la boucle while, je suis preneur.

Cordialement.

Pierre.