fonctions gsm

Bonjour,
j’ai deux fonctions GSM qui fonctionnent individuellement.
Par contre contre, quand j’essaye de les mettre à deux dans la loop, ça ne fonctionne pas. Pourriez-vous me donner des pistes svp. J’ai essayéde plusieurs façons mais rien à faire, ça ne marche pas…

#include <SoftwareSerial.h>

SoftwareSerial Sim(7, 8);

// variables
char bufRecSim[100];     // buffer de réception
int cptRecSim;           // compteur
char bufIndexSMS[10];       // pour memorisation index du message
int  cptIndex;
char bufIndex[10];          // pour l'index en chaine de caracteres brut
char *ptrIndex;             // pointeur tempraire pour traitement de l'index

char cmdSim[30];         // pour les commandes à destination du Sim900
int litSMS = 0;              // drapeau pour signaler que la prochaine ligne est le contenu du SMS
bool recommence = true;       // pour la boucle de lecture des données venant du SIM
char c;                     // pour traiter un caractère

String msg;
int val_signal;

int led_rouge = 2;
int led_orange = 3;
int led_verte = 4;

void setup()
{
	Sim.begin(9600);  // the GPRS baud rate
	Serial.begin(9600);  // le PC pour verification

	pinMode(led_rouge, OUTPUT);
	pinMode(led_orange, OUTPUT);
	pinMode(led_verte, OUTPUT);
	digitalWrite(led_rouge, LOW);
	digitalWrite(led_orange, LOW);
	digitalWrite(led_verte, LOW);
}

void loop() {
	reception_message();

	mesure_qualite_signal();
}

void reception_message() {
	if (Sim.available()) {
		while (Sim.available()) {
			// utilisation de peek pour rechercher le caractère NL et CR
			c = Sim.peek();
			switch (c) {
			case '\x0a':
			case '\x0d':
				Sim.read();
				if (cptRecSim > 0) {
					bufRecSim[cptRecSim++] = '\x0a';
					bufRecSim[cptRecSim++] = '\0';
					cptRecSim = 64;
				}
				break;
			default:
				bufRecSim[cptRecSim++] = Sim.read();
				break;
			}
			if (cptRecSim == 64) break;
		}
	}
	// si cptReception = 64, la ligne est entière
	if (cptRecSim == 64) {
		if (litSMS) {
			// c'est ici que l'on passe au traitement du contenu du SMS
			// dans mon cas, je l'affiche...
			Serial.print(bufRecSim);
			// on repasse le drapeau à 0 pour l'attente d'un nouveau SMS
			litSMS = 0;
		}
		// on peut comparer le début de ligne
		if (strstr(bufRecSim, "+CMGR:")) {
			litSMS = 1;
		}
		// On attend un +CMTI:
		if (strstr(bufRecSim, "+CMTI:")) {
			// Un nouveau message est arrivé, il faut récupérer l'index du message
			// Le formt est "+CMTI: "SM",<index>"
			ptrIndex = strchr(bufRecSim, ',');
			// L'index se trouve juste après le caractère ',' donc du pointeur ptr + 1
			ptrIndex++;
			sprintf(bufIndex, "%s", ptrIndex);
			cptIndex = 0;
			// il faut enlever les caracteres parasites comme \x0a             
			while (1) {
				if ((bufIndex[cptIndex] < '\x30') || (bufIndex[cptIndex] > '\x39')) {
					bufIndex[cptIndex] = '\0';
					// on sort du while
					break;
				}
				cptIndex++;
			}
			sprintf(cmdSim, "AT+CMGR=%s\r", bufIndex);
			Sim.write(cmdSim);
		}
		// la ligne a ete traite, cptRecSim900 repasse à 0
		cptRecSim = 0;
	}
}

void mesure_qualite_signal() {
	msg = "";
	Sim.println("AT+CSQ");      //indique la qualit? du signal, de 0 ? 31 (31 ?tant la meilleure qualit?)
	delay(200);
	while (Sim.available()) {
		msg += String(char(Sim.read()));
	}
	val_signal = msg.substring(15, 17).toInt();

	digitalWrite(led_rouge, LOW);
	digitalWrite(led_orange, LOW);
	digitalWrite(led_verte, LOW);

	if (val_signal < 10) {
		digitalWrite(led_rouge, HIGH);
	}

	if ((val_signal >= 10) && (val_signal < 13)) {
		digitalWrite(led_orange, HIGH);
	}

	if (val_signal >= 13) {
		digitalWrite(led_verte, HIGH);
	}
	Serial.print("Qualite signal: "), Serial.print(val_signal), Serial.println(" / 31");
}

vous ne gérez pas correctement le port série. En faisant cela

Sim.println("AT+CSQ");      //indique la qualit? du signal, de 0 ? 31 (31 ?tant la meilleure qualit?)
	delay(200);
	while (Sim.available()) {
		msg += String(char(Sim.read()));
	}
	val_signal = msg.substring(15, 17).toInt();

vous essayez de deviner à quelle vitesse la réponse va arriver sur votre port série (en gros vous pensez qu'en 200ms la réponse et là et tient dans le buffer de 64 octets) et ne faites aucune validation de la réponse. Ce n'est pas suffisant ni robuste.

Il faut balancer la commande, puis ensuite attendre une réponse complète. Par exemple un AT+CSQ va vous répondre avec un "+CSQ: 28,99\r\n" --> le + est un marqueur de début de réponse et le CR/LF (ou juste CR ou juste LF) le marqueur de fin de réponse. c'est cela que vous devez attendre, patiemment, sans utiliser de delay(), et ensuite analyser le résultat.

Si vous voulez comprendre comment bien écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

OK, merci. Je vais revoir vos explications et ensuite modifier mon code.
encore merci!