reception serie avec rtc

Bonjour,
je voulais enregistrer ma liaison série sur une carte SD.
Si le message était de bonne taille alors je l’enregistrais sinon j’affiche qu’il y a débordement.

Le programme fonctionne sauf que j’ai rajouté un RTC pour dater les acquisitions.
Et depuis la création de l’objet RTC , à chaque message de débordement l’Arduino redémarre sans affiche le débordement
Sinon tout fonctionne quand la taille est bonne.

//blbliotheque
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>
#define green 4

byte rec[500]={0};//tableau valeur reçue
int q=0;//variable indiquand la taille du tableau
int limite= 0;//indique la dernière case du tableau rempli
int i = 0;//correspond au num d'événement


File myFile;//nom donner pour ecrire sur la SD
RTC_DS1307 rtc;
int evenement = 0;//indique le nombre d'événement
float val=0;//correspond au niveau de la batterie
unsigned long temps=0;//temps dans la communication série
int debordement=0;//debordement du message reçu

 //creation nouveau fichier a chaque demarrage
 char filename[50];//tableau de 5& cases
   
   

void setup()

{
  pinMode (green, OUTPUT);
   Serial.begin(9600);//initialise la communication
   #ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

 /* if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
   // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }*/
  
   // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
     SD.begin(10);//initialise le port de la carte SD
   strcpy(filename, "RS232L00.TXT");//ajout du nom (RS232L00) dans le tableau 
      for (uint8_t i = 0; i < 100; i++) 
      {
        filename[6] = '0' + i/10; //incremente la case 7 des que i augmente de dizaine
        filename[7] = '0' + i%10;//incremente la case 8 des que i augmente d'unité
        
        //si le nom du fichier n'existe pas, il le crée
        if (! SD.exists(filename)) {
          break;
        }
      }

  myFile = SD.open(filename, FILE_WRITE);//ouverture de la SD en créant le fichier
  //ecritue dans le fichier//
  myFile.print("evenement");
  myFile.print("#");
  myFile.print("U batt");
  myFile.print("#");
  myFile.print("date");
  myFile.print("#");
  myFile.print("heure UTC");
  myFile.print("#");
  myFile.print("flag overflow");
  myFile.print("#");
  myFile.println("message RS232");
  myFile.close();//fermeture du fichier
  // rtc.begin(DateTime(F(__DATE__), F(__TIME__))); //initialise l'heure du RTC a celle du PC      
}
 
void loop()
{  
  if(Serial.available()>0)//si il y réception d'un message
        {
          rec[q] = Serial.read();  //enregistre chaque octet dans le tableau REC      
          limite= q;//indique la derniere case remplise du tableau
          q++;//incremente q
          temps = millis();//temps correspond au temps depuis le demarrage de l'arduino
               
         }
  
  if(q>500)//si q est supperieur à 500 (message trop volumineux pour l'arduino
  {
    
   digitalWrite(green, HIGH);//allume la led
   q=0;//on remets l'écriture du tableau au depart
   debordement=1;//mets le debordement à 1
  }
    else//sinon
 { 
   digitalWrite(green, LOW);//on eteint la led
      if(q>10)//si q>10 (donc si ca correspond a la taille min d'un message)
       {     
          unsigned long nowMillis = millis();//ajout le temps dans la variable nowMillis
            
           if(temps+1000<nowMillis)//si on reçois plus de message depuis au moins 1s
             {
          
               myFile = SD.open(filename, FILE_WRITE);//ouverture du fichier 
               DateTime now = rtc.now();
                         val = analogRead(0);//val correspond au niveau de batterie 
                         val = (val*5/1024)*3;//converti le niveau de la batterie en V
                         myFile.print(evenement++);//ecrit le num de l'événement
                         myFile.print('#');//ecrit un séparateur
                         myFile.print(val);//écrit le niveau de batterie
                         myFile.print('#');
                          
                         myFile.print(now.day(), DEC);//ecrit le jour
                         myFile.print('/');
                         myFile.print(now.month(), DEC);//ecrit le mois
                         myFile.print('/');
                         myFile.print(now.year(), DEC);// ecrit l'année 
                         
                         myFile.print('#');
                         myFile.print(now.hour(), DEC);//ecrit l'heure
                         myFile.print(':');
                         myFile.print(now.minute(), DEC);//écrit les minutes
                         myFile.print(':');
                         myFile.print(now.second(), DEC);//écrit les secondes
                         myFile.print('#');
                           if(debordement==0)//si il n'y a pas eu de débordement du message
                           {
                           myFile.print("0");//on l'écrit
                           }
                           else//sinon
                           {
                            myFile.print("1");//sinon on ecrit l'inverse
                           } 
                         myFile.print('#');
      
        
                          for(int y=0;y<=(limite);y++)//de la premiere case à la dernière case du tableau rempli
                          {
                          int z=(rec[y]);//ajoute  la valeur de la case dans Z
                           if (rec[y] < 16) myFile.print("0");//si la valeur est inférieur à 16 en hexa, on rajoute un zero pour afficher la valeur sur un octet
                           myFile.print(z,HEX);//ecrit la valeur 
                           }
                    
                      
                     myFile.println("");//on saute une ligne
                    myFile.close();//on ferme le fichier
                    q=0;//on remets la réception d'un message à la première case du tableau
                    debordement=0;//on réinitialise le débordement

            }
        } 
     }    
}

Salut,

Débordement de RAM toujours ,t’en consomme surement trop

Non j'ai essayé sur un Arduino Mega et je suis large (croquis 7%et variable 32%) memoryfree a 6700

Ah oui ok : le problème c'est que certes tu affiches le débordement, mais tu débordes quand même ... Donc l'index de ton tableau dépasse la taille du tableau, donc erreur et reboot.

Il faut rendre impossible le remplissage du tableau si q dépasse 499