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
