Bonjour à tous
J'ai un problème de transmission que seule la sensibilité humaine peut trouver, enfin je l'espère:

J'envoie une commande d'un ESP32 équipé d'un HC12 vers une carte XIAO équipée aussi d'un HC12; puis j'attends un accusé réception.
Le message de retour doit être stocké dans un tableau de caractères mRetour[20].
Cela fonctionne dans la plupart des cas, mais, de temps en temps, l'accusé réception ne parvient pas (1 fois sur 5 ou 10), alors qu'il est bien émis de la carte distante.
La routine d'envoi et de réception côté ESP32:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//********************Emission / reception *******************************************
bool xmit(char *cc){
  Serial.print("Msg envoye: "); 
  afficMsg(XMIT,false,10,20);                     //Transmission en cours
  uint8_t k=0; bool ok=false;                     //k->compteur de reception             
  //mRetour = "";                                   //message de retour sur question                                  //recepteur de catactere en code ASCII  
  /*while(Serial2.available()>0){
    char r=Serial2.read();                             //vidage du buffer de reception
  }*/
  Serial2.print(cc);                              //envoi de la commande
  Serial.println(cc);
  unsigned long tic=millis();                     //declenchement du chrono
  while((!Serial2.available()) && (millis()-tic < ATTENTE));  //attente de la reception
  if(Serial2.available()>0){
    do{ //*****tant que non ok et non timeout 5s *************************************
      int r = Serial2.read();                         //lecture d'un caractere (code ASCII)
        if(r >= 30 && r< 90 ) {                       //si r est compris entre 0 et Y de ASCII
          mRetour[k] = char(r);                       //charge le caractere
          k++;                         
          tic=millis();                             //redeclenche le timer
        }
        else if(r == 90){
          ok = true;        //le 'Z' (90) est le caractere de fin de message
          mRetour[k] = '\0';
        }
        //delai('m',20);                           //attend la reception d'autres caracteres
    }while(millis()-tic < ATTENTE && !ok);         //tant que pas de timeout et non ok  
  }
  else{                             //pas de message recu - Timeout
    effaceMsg(false,true);          //efface la deuxieme ligne , garde la premiere avec la commande
    afficMsg(TIMOUT,true,10,20);    //affiche Timeout sur la deuxieme ligne
  }  
  return (ok)? true: false;
}
Une des routines de réception côté ESP32:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
      //**************demande l'etat des equipements d'une carte */
      case 'E': {
        if(iParam==0 && (numCarte > NB_VOLET || nbCarSaisis != 5)){   //Erreur commande etat des volets
          sprintf(buf,"%s",ERCOM);
          afficMsg(buf,true,10,20);
          return;
        }
        else if(iParam==0){   //Exy00  demande etat d'un volet
          sprintf(buf,"Etat %s %d demande?", VOL,numCarte);
          afficMsg(buf);
          if(xmit(carCom)){
            int adresse = 0;
            int posVol = 0;
            bool ok=true;
            if (sscanf(mRetour, "K%d=%dE", &adresse, &posVol) == 2) {
              Serial.printf("Retour: adresse = %d Valeur: %d\n", adresse,posVol);
            }
            else{
              Serial.printf("%s\n",ERFMT);
              ok=false;
            }
            if(ok){
              if(posVol == 100){
                sprintf(buf,"%s %d est en %s totale",VOL,numCarte,OUV);
              }
              else if(posVol == 0){
                sprintf(buf,"Etat %s %d en %s totale",VOL,numCarte,FER);
              }
              else
                sprintf(buf,"%s %d est %s de %d%c",VOL,numCarte,OUV,posVol,'%');
              //if ok
              effaceMsg(false,true);
              afficMsg(buf,true,10,20);
            }
          }
          else{
            Serial.println(ERACK);
            afficMsg(ERACK,true,10,20);  
          }
        }
      }
      break;
Message envoyé côté XIAO:
Msg reçu: E1200
Reponse: K12=0EZ
Message reçu côté ESP32 lorsque cela fonctionne:
Msg envoye: E1200Z
....Retour: adresse = 12 Valeur: 0
Lorsque cela ne fonctionne pas:
Msg envoye: E1200Z
Erreur d'acquitement
Si quelqu'un a une idée?