[Résolu] enregistrement liaison série dans un tableau

Bonjour,
Je voudrais récupérer les données d'un signal sur une liaison RS232.
Pour ne pas avoir de perte, je mets les données dans un tableau et voudrais les affichées quand la liaison n'est pas occupé.

#include <SoftwareSerial.h>
//
SoftwareSerial BTSerial(2, 3); // RX | TX
// RX arduino <--- TX cible
// TX arduino ---> RX cible
byte rec[1500]={0};
int q=0;
int a=0;
int limite= 0;


void setup()

{
 Serial.begin(9600);
 BTSerial.begin(9600);  // vitesse software serial

}

void loop()
{
   if(BTSerial.available()>0)
   {
     
   
       rec[q] = BTSerial.read();
       limite= q;
       q++;
   
       }
   
 
   if(!BTSerial.available())
   {
     
       while(a!=limite)
       {
       // if (rec[a] < 16) Serial.print("0");
        Serial.println(rec[a], HEX);
        delay(200);
        a++;
       }
   }
   
   }

Cependant j'ai toujours des pertes

Salut,

il faut un delay(20) après if(BTSerial.available()) sinon la trame n'a pas le temps d'arriver

j'ai modifié le programme, j'arrive à afficher mais pas à enregistrer sur la carte SD

Pour l'afficher

#include <SoftwareSerial.h>
//
SoftwareSerial BTSerial(2, 3); // RX | TX
// RX arduino <--- TX cible
// TX arduino ---> RX cible
byte rec[500]={0};
int q=0;
int a=0;
int limite= 0;
int i = 0;


void setup()

{
 Serial.begin(9600);
 BTSerial.begin(9600);  // vitesse software serial

}

void loop()
{
   if(BTSerial.available()>0)
   {
     
   
       rec[q] = BTSerial.read();
       limite= q;
       q++;
   
       }
   
 
   if((!BTSerial.available()) && ((digitalRead(8))==1))
   {
    
            while(a!=(limite+1))
             {
              if (rec[a] < 16) Serial.print("0");
              Serial.print(rec[a], HEX);
              //delay(50);
              a++;
             }
          
   
       
       
    }
    
    
   }

Pour la SD

#include <SD.h>
#include <SoftwareSerial.h>
#include <SPI.h>

#include <SoftwareSerial.h>
//
SoftwareSerial BTSerial(2, 3); // RX | TX
// RX arduino <--- TX cible
// TX arduino ---> RX cible
byte rec[500]={0};
int q=0;
int a=0;
int limite= 0;
int i = 0;

File logfile;
void setup()

{

 BTSerial.begin(9600);  // vitesse software serial
 SD.begin(10);
 // Serial.begin(38400); // vitesse serial monitor
   
   //  logfile = SD.open(filename, FILE_WRITE);;
}

void loop()
{
   if(BTSerial.available()>0)
   {
     
   
       rec[q] = BTSerial.read();
       limite= q;
       q++;
   
       }
   
 
   if((!BTSerial.available()) && ((digitalRead(8))==1))
   {
    
            while(a!=(limite+1))
             {
                logfile = SD.open("filename.txt", FILE_WRITE);
                 if (rec[a] < 16) logfile.print("0");
                logfile.print(rec[a], HEX);
                
                logfile.close();
             
              a++;
             }
          
   
       
       
    }
    
    
   }

ps: le delay me faisais perdre des données

filename.txt existe sur la SD ?

oui

Essaye :

logfile = SD.open("filename.txt", FILE_WRITE);

 while(a!=(limite+1))
             {
                 if (rec[a] < 16) logfile.print("0");
                logfile.print(rec[a], HEX);
             
              a++;
             }
   logfile.close();

ça ne fonctionne sauf si je mets toute la liaison en commentaire
Je pense a un conflit sérial et sd mais je vois pas

Quelle liaison en commentaire ?

ceci

if(BTSerial.available()>0)
   {
     
   
       rec[q] = BTSerial.read();
       limite= q;
       q++;
   
       }
   
 
   if((!BTSerial.available()) && ((digitalRead(8))==1))
   {

je trouve cela étrange de pouvoir afficher sur le moniteur série mais pas arrive sur une carte SD

Parce qu'il y a un problème avec l'écriture tout simplement. T'es sûr du pin 10 ?

EDIT: ah mais attend t'es sur quelle carte ?

oui je suis sur le pin 10 c'est normal , je n'ai pas de problème à écrire avec d'autre programme.

je suis sur une arduino duemilanove pourquoi ?

Bin parce qu'un tableau de 1500 bytes ça occupe un paquet de RAM, avec la lib SD qui en squatte de mémoire 512, normal que tu aies des problèmes avec un atmega328 à 2ko de SRAM

B@tto:
Bin parce qu'un tableau de 1500 bytes ça occupe un paquet de RAM, avec la lib SD qui en squatte de mémoire 512, normal que tu aies des problèmes avec un atmega328 à 2ko de SRAM

salut B@tto
et en plus ça depend de quel "duemilanove" :grin:

SRAM1 KB (ATmega168) or 2 KB (ATmega328)

J'avais déjà diminué la taille du tableau mais ça résous pas le problème :-/
Je ne comprends pas ce pourquoi il n'écrit pas

Les exemples fourni avec la lib SD.h fonctionnent au moins ??

oui sans problème, il y a des interférence entre la SD et la liaison série

Hardware Serial utilise de la mémoire pour tamponner les données reçues et émises (2 x 64 octets).
Software Serial utilise de la mémoire pour tamponner les données reçues (64 octets).
SD utilise de la mémoire pour tamponner les données échangées avec la carte mémoire (1 bloc mémoire de 512 octets + des variables pour mémoriser l'état du système de fichier)

Utilise cette librairie pour voir ton occupation mémoire. Faire appel à la fonction à la fin du setup() lorsque toutes les classes sont instanciées. Et puis à quelques endroits dans le code pour voir l'évolution.

il y a que avec la liaison série et la carte SD que tout "explose" mais je ne vois pas comment faire, j'ai besoin des deux

Assures-toi déjà que c'est bien un problème de mémoire.
Si c'est le cas, alors le processeur n'est pas adapté. Et il faudra passer à un autre (arduino Mega, Teensy ....).
Si ce n'est pas un problème de mémoire alors il faut chercher où ça plante.

C'est bien un problème de mémoire.
Voilà le compte-rendu de la compilation de ton code

Sketch uses 5 020 bytes (16%) of program storage space. Maximum is 30 720 bytes.
Global variables use 1 805 bytes (88%) of dynamic memory, leaving 243 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur

Tu pourrais grapiller une centaine d'octets en réduisant, dans les librairies, la taille des tampons des liaisons série. Mais cela a des conséquences, il faut que le programme soit réactif afin qu'il n'y ait jamais de débordement.