Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Comment ajouter un time-out sur une fonction existante
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 22 janv. 2017 09:13

Bonjour à tous,

Toujours avec mon GSM2 .......

Dans le programme exemple, il n'y a pas de time-out en cas de NON réponse du module ! sur un tuto j'ai pus lire que ce time-out était important pour ne pas "bloquer" l'application ! en effet si pour une raison ou une autre le message est mal parti ou mal reçu , la réponse ne sera jamais bonne!
dans ce cas il est préférable de sortir sans rien faire plutôt que de resté bloquer .

dans mon cas j'ai fixé un time-out de 5 secondes et je vais quand même essayer de relancer la commande 3 fois !

Voici la commande originale :

On envoie une commande ( ici "ATE") et on attend la réponse ! le probléme c'est qu'on peut resté bloquer étant donné qu'il y a des boucles infinies

Code : Tout sélectionner

// Quelques paramétrages du module
  M95_Send_Ram("ATE");        // Réglage des messages de type "texte"
  Wait_response(GSM_OK); // Attende de la réponse     



Code : Tout sélectionner

//------------------------------------------------------------------------------
// Envoi de commande ou donnée (RAM)
void M95_Send_Ram(char *s1){
   while(*s1) {
    UART_Write(*s1++);
   }
   UART_Write(0x0D);   // On termine par un CR
}

//------------------------------------------------------------------------------
// Get GSM response, if there is any
short Get_response() {
    if (response_rcvd) {   // Si il y a une reponse qui est finie  (flag levé)
      response_rcvd = 0;   // RAZ du flag
      return responseID;   // On renvoie l'identification de la réponse
    }
    else
      return 
-1;           // Sinon on renvoie -1
}

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {
char test = 1;

  while (test){
  test = Get_response();
  if ((test == rspns) || (test == GSM_ERROR))
    test = 0;
  else
    test 
= 1;
  }
}
 




Voila ce que je comptais faire de mon coté !
Auriez vous des suggestions ou des idées , ou tout simplement me dire que ça fonctionnera pas ! oops

J'envoie une commande ainsi que la réponse que l'on attend avec cette commande ( la réponse peut varier suivant la commande)
Je rentre dans une première boucle qui envoie la commande et qui attend la réponse pendant 5 secondes ( j’utilise ici un compteur plutôt qu'un timer car il seront utilisé plus loin).
Si au bout de 500 boucles de 10 ms , soit environ 5s, je n'ai toujours pas de réponse, j’incrémente un second compteur pour savoir a combien de tentative j'en suis , puis je RE-lance ma commande etc ...
Si au bout de 3 tentatives d'envoi de commande je n'ai toujours pas de réponse je sors !
Si j'ai une bonne réponse je sors


Code : Tout sélectionner

//------------------------------------------------------------------------------
// Quelques parametrages du module
   
envoi_commande_test("ATE"GSM_OK);   // Désactivation de la commande "Echo" et attente reponse     


Code : Tout sélectionner

//------------------------------------------------------------------------------
// Envoi de commande ou donnée (RAM)
void envoi_commande_test(char *s1,char rspns){

  unsigned int Compteur=0, Compteur2 = 0;
  short Pas_de_reponse = 0, rep =0;
  
  do
{
         Compteur = Pas_de_reponse = 0;
         
         while
(*s1) {
          UART_Write(*s1++);
         }
         UART_Write(0x0D);   // On termine par un CR
         delay_ms(100);
         
       while
(1){
           rep = Recup_reponse();
           if ((rep == rspns) || (rep == GSM_ERROR)){
              break;
            }
           else{
                Compteur++;
                delay_ms(10);
                if (Compteur > 500){      // aprés 5 secondes d'attente
                   Pas_de_reponse = 1;
                   Compteur2++;
                   break;
                }
            }
        }
    }while( (Compteur2<3) && (Pas_de_reponse==1) );


Merci
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Comment ajouter un time-out sur une fonction existante
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » ven. 27 janv. 2017 14:08

Bonjour Jeremy,

Cela parait cohérent ( mais je ne l''ai pas testé en reel)
il faut juste verifier que le break situé à l'interieur du "if .. else.."
te fait bien sortir de la boucle while(1)
Aide toi, le ciel ou FantasPic t'aidera

Comment ajouter un time-out sur une fonction existante
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » sam. 28 janv. 2017 11:37

Bonjour à tous,

Meric Paul d'voir jeté un oeil dessus !

Voici ma version final qui fonctionne à 100% pour la partie envoie d'un message avec attente de réponse.

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Envoi de commande ou donnée avec attente de la réponse
// Param. d'entrée : La commande ,et la réponse attendue a cette commande
void envoi_commande_avec_reponse(char *s1char rspns ){

    
char Compteur=0Compteur2 =0;
    
    
Bonne_reponse 0;    // RAZ de la variable
    
    
RCIE_bit 1;         // Autorise les INT Rx UART
    
    
do{
         
// ---- Envoi de la commande
         
while(*s1) {
            
UART_Write(*s1++);
          }
         
UART_Write(0x0D);   // On termine par un CR

        //---- Boucle d'attente de Reponse ou timeout
        
while (1){
             
Compteur++;              // compteur de time out
             
delay_ms(50);
             if (
ReponseID == rspns){
                 
Bonne_reponse 1;
                 break;
              }
             else if ( (
ReponseID == GSM_ERROR) || (Compteur>100) ){
                 
Compteur 0;  // RAZ du time out
                 
Compteur2++;   // compteur de renvoi de commande
                 
Bonne_reponse 0;
                 break;
              }
         }

     }while ( (
Compteur2<3) && (Bonne_reponse==0) ); // Je sors apres 3 tentatives d'envoi ou j'ai recu la Reponse attendue
     
   
RCIE_bit 0;


Pour le moment j'avance à pas de loup, et j'essaye chaque fonction au fur et à mesure !

Mais j'ai de l'espoir car maintenant je suis a 9600 bauds sans probléme, aucun loupé depuis plusieurs jours, même avec la fonction d’extinction totale du module .

Mode satisfait ! :-D pour le moment
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 29 invités