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:
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 //********************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; }
Message envoyé côté XIAO:
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 reçu côté ESP32 lorsque cela fonctionne:Msg reçu: E1200
Reponse: K12=0EZ
Lorsque cela ne fonctionne pas:Msg envoye: E1200Z
....Retour: adresse = 12 Valeur: 0
Si quelqu'un a une idée?Msg envoye: E1200Z
Erreur d'acquitement







Répondre avec citation




Partager