Problème avec software Serial ?

Bonjour la France,
(J ai posté à l international, mais j ai du mal à trouver réponse à mon problème.)
Le programme communiqué avec un gsm sim900, via software Serial, mais des données apparaissent sans raisons dans le buffer. La procédure incriminée fonctionnait il y a peu.
Je penche pour des fuites mémoire, du coup j ai réformé les strings en chars.
La taille de la mémoire du mega 256 est suffisante dans après Memoryfree.
Le bug intervient en tout début de programme durant le setup, pour le code

Tout est ici
Ou la

Merci pour votre coup de œil avisé
Brolensky

bonjour,
comme il a été suggéré, fais un prog élément par élément pour trouver le soucis

If there really is a bug in SoftwareSerial it should be possible to write a short program that illustrates the problem.

et

if (Sim900Serial.available()>100){

Bonjour infobarquee et merci,
Le but ne doit pas venir de software Serial mais je vais tenter de tronquer le programme au mini du code que je viens de poster.
Je reviens vers vous demain

Pourquoi attendre d'avoir 100 caractères reçus ??

Évitez de poster à deux endroits

Pourquoi attendre.? Pour être sûr de 'ne pas surgenerer de problème et aussi pour observer le système un peut plus proche de ses conditions de vie:Du débug Bio quoi.

Si tu ne l'as pas changée, la taille du buffer de réception est de

#define _SS_MAX_RX_BUFF 64 // RX buffer size

alors attendre 100 caractères c'est peut-être un peu suicidaire.

@fdufnew Le buffer est porté à 128. Merci pour ton regard.

Pour la limite à 100, une autre raison (que j’avais oublié) est que mon premier test à été

while (Sim900Serial.available()){Serial.print(Sim900Serial.read());}

J’obtenais alors une chaine de carractère infini!

Je tente une version abrégée du code: le bug c’est déplacé mais il est encore dans ces quelques lignes…
Je poste le code et la sortie d’ici qq minutes

J'ai donc abregé le code
le programme bloque sur un

while(!Sim900Serial.available());

Voici la sortie du code sur le Serial

Pour mode labo, redemarrer avec pin 2 au +
Le SETUP!
Purge:!
<<AT
A#2
>>A
Anti Overflow:T
OK
!
SS0 0
SS1 0
Relais.Num: 1 ETat: 1
SS2 0AT+SGPIO=0,1,1,0
SS3 0

Et voici la procedur void Relais légèrement modifiée pour le débug.
Le includes et déclarations restent les mêmes que posté surr le post international

void Relais(byte Num, byte Etat){
  
  Serial.print("\nSS0 ");Serial.print(Sim900Serial.available());delay(1000);
  byte inChar;
  if (Sim900Serial.available()){
     Serial.print(F("\nBuffer:"));for(byte x=0;x<100;x++){ Serial.print(Sim900Serial.read());};}
     
  Serial.print("\nSS1 ");Serial.print(Sim900Serial.available());delay(1000);
  //Relais inverseur =-1en voie1;
  //Relais 0 en voie2... donc +2
  char Txt[20];
  memset(Txt,'\0',20);
  bool Tate = false;
  if (!Etat){Tate=true;}
  if (Sim900Serial.overflow()) {Serial.println(F("\n##############################\nSoftwareSerial overflowR!\n##############################")); }
  if (Num == 10) {
     for (byte Num=1;Num<10;Num++){
	 DEBUGO_PRINT(F("\nRelais.Num: "));DEBUGO_PRINT(Num);DEBUGO_PRINT(F(" ETat: "));DEBUGO_PRINT(Etat);
         //Carte relais inversee//AT+SGPIO=0,1,1,0
         sprintf_P(Txt,PSTR("AT+SGPIO=0,%d,1,%d"),Num,Tate); delay(30);
         while(!Sim900Serial.available());
         Sim900Serial.println(Txt);delay(75);}return;}
   
  if (Num == 255){Num=1;}else{Num = Num +2;}
  DEBUGO_PRINT(F("\nRelais.Num: "));DEBUGO_PRINT(Num);DEBUGO_PRINT(F(" ETat: "));DEBUGO_PRINT(Etat);
  //Carte relais inversee//AT+SGPIO=0,1,1,0
  delay(1000);
  sprintf_P(Txt,PSTR("AT+SGPIO=0,%d,1,%d"),Num,Tate);
  Serial.print("\nSS2 ");Serial.print(Sim900Serial.available());
  Serial.print(Txt);
  Serial.print("\nSS3 ");Serial.print(Sim900Serial.available());
  while(!Sim900Serial.available());
  Serial.print("\nSS4 ");Serial.print(Sim900Serial.available());delay(1000);
  Sim900Serial.println(Txt);
  Serial.print("\nSS5 ");Serial.print(Sim900Serial.available());delay(1000);
  if (Sim900Serial.overflow()) {Serial.println(F("\n##############################\nSerial overflow!R2\n##############################")); }
}
[/Code

En piéce jointe le code abrégé

RegulClimat_Debug.zip (25.3 KB)

  if (Sim900Serial.available()){
     Serial.print(F("\nBuffer:"));for(byte x=0;x<100;x++){ Serial.print(Sim900Serial.read());};}

bizarre ce code… si un caractère est dispo vous essayez d’en lire 100?

Voici la sortie du code sur le Serial

Pour mode labo, redemarrer avec pin 2 au +
Le SETUP!
Purge:!
<<AT
A#2
>>A
Anti Overflow:T
OK
!
SS0 0
SS1 0
Relais.Num: 1 ETat: 1
SS2 0AT+SGPIO=0,1,1,0
SS3 0

Et voici la procedur void Relais légèrement modifiée pour le débug.
Le includes et déclarations restent les mêmes que posté surr le post international

void Relais(byte Num, byte Etat){
 
 Serial.print("\nSS0 ");Serial.print(Sim900Serial.available());delay(1000);
 byte inChar;
 if (Sim900Serial.available()){
    Serial.print(F("\nBuffer:"));for(byte x=0;x<100;x++){ Serial.print(Sim900Serial.read());};}
    
 Serial.print("\nSS1 ");Serial.print(Sim900Serial.available());delay(1000);
 //Relais inverseur =-1en voie1;
 //Relais 0 en voie2... donc +2
 char Txt[20];
 memset(Txt,'\0',20);
 bool Tate = false;
 if (!Etat){Tate=true;}
 if (Sim900Serial.overflow()) {Serial.println(F("\n##############################\nSoftwareSerial overflowR!\n##############################")); }
 if (Num == 10) {
    for (byte Num=1;Num<10;Num++){
DEBUGO_PRINT(F("\nRelais.Num: "));DEBUGO_PRINT(Num);DEBUGO_PRINT(F(" ETat: "));DEBUGO_PRINT(Etat);
        //Carte relais inversee//AT+SGPIO=0,1,1,0
        sprintf_P(Txt,PSTR("AT+SGPIO=0,%d,1,%d"),Num,Tate); delay(30);
        while(!Sim900Serial.available());
        Sim900Serial.println(Txt);delay(75);}return;}
  
 if (Num == 255){Num=1;}else{Num = Num +2;}
 DEBUGO_PRINT(F("\nRelais.Num: "));DEBUGO_PRINT(Num);DEBUGO_PRINT(F(" ETat: "));DEBUGO_PRINT(Etat);
 //Carte relais inversee//AT+SGPIO=0,1,1,0
 delay(1000);
 sprintf_P(Txt,PSTR("AT+SGPIO=0,%d,1,%d"),Num,Tate);
 Serial.print("\nSS2 ");Serial.print(Sim900Serial.available());
 Serial.print(Txt);
 Serial.print("\nSS3 ");Serial.print(Sim900Serial.available());
 while(!Sim900Serial.available());
 Serial.print("\nSS4 ");Serial.print(Sim900Serial.available());delay(1000);
 Sim900Serial.println(Txt);
 Serial.print("\nSS5 ");Serial.print(Sim900Serial.available());delay(1000);
 if (Sim900Serial.overflow()) {Serial.println(F("\n##############################\nSerial overflow!R2\n##############################")); }
}

En piéce jointe le code abrégé

RegulClimat_Debug.zip (25.3 KB)

Tu bloques sur le while(!Sim900Serial.available()); mais en même temps, il semblerait que tu n'aies encore envoyé aucune commande AT au Sim900 donc c'est possible qu'il ne réponde rien.

il y a toujours le soucis de lire des choses qui ne sont potentiellement pas là…

byte inChar;
 if ([color=red]Sim900Serial.available[/color]()){
    Serial.print(F("\nBuffer:"));for([color=red]byte x=0;x<100;x++[/color]){ Serial.print([color=red]Sim900Serial.read()[/color]);};}

fdufnews:
Tu bloques sur le while(!Sim900Serial.available()); mais en même temps, il semblerait que tu n'aies encore envoyé aucune commande AT au Sim900 donc c'est possible qu'il ne réponde rien.

C est que cette ligne ne posait pas de problème ,jusqu'à ce que je simplifié le code pour pouvoir le poster.
Donc maintenant sim900serial n est pas available, mais juste avant il recevait des données aberrante. ..
Peut être une mauvaise gestion des chars, merci de me dire ou des bibliothèques incompatibles comme on me l à dit...mais je ne sais pas sur quel critère.

J-M-L:
il y a toujours le soucis de lire des choses qui ne sont potentiellement pas là…

byte inChar;

if ([color=red]Sim900Serial.available/color){
    Serial.print(F("\nBuffer:"));for(byte x=0;x<100;x++){ Serial.print(Sim900Serial.read());};}

Je comprends que cette ligne n est pas bonne dans l absolu. Elle avait toute ça cohérence il y a peu, je vais la modifier, même si à priori elle n entrave pas la bonne marche du programme car available vaut ici 0.
Merci pour vos commentaires

Vous êtes sûr que les pins utilisées pour le software serial ne servent à rien d'autre? Dépendez vous d'interruption dans votre code?

A priori oui tout est ok pour les pins, cela fonctionnait (plus ou moins bien avant, voir sans bugger pdt 15jours). Le bug change de place en fonction du nombre lignes ajoutées, mais il concerne toujours software serial... . Merci, Je vais vérifier cette piste.

Comment savez vous que le bug change de place ?

@J-M-L: Car le programme va plus ou moins loin dans ca marche normale avant de declencher un des simSerial overflow dont j’ai jalonné le programme…
Du coup je suis content car j’ai put diviser la taille du code par 6 de 60000 octet je n’en ai plus que 10000… et seulement quelques procedures appellées!

@ BUG: tu es fais comme un rat (ou pas)

PS cela fais 1 mois que ce rat me grignote l’existance
(je fais passer mes 5 minutes)