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 ---
- 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 ---
Modérateur : Jérémy
Comment ajouter un time-out sur une fonction existante
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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
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 !
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
Merci
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 !
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
Comment ajouter un time-out sur une fonction existante
Comment ajouter un time-out sur une fonction existante
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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.
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 ! pour le moment
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 *s1, char rspns ){
char Compteur=0, Compteur2 =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 ! pour le moment
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 29 invités