Problème écrite carte SD + Arduino Ethernet

Bonjour à tout le monde,

Dans le cadre d’un projet d’électronique, je souhaite utiliser une Arduino Ethernet ainsi qu’une carte SD afin d’écrire des données reçues. Pour avoir une meilleure compréhension de mes soucis, je vais commencer par décrire mon système puis je vais vous présenter les difficultés que je rencontre.

Comme dit précédemment, j’utilise un Arduino Ethernet sur lequel sont installés un capteur ainsi qu’une carte SD. Le capteur est alimenté par la carte et utilise la broche Rx de l’Arduino. La carte SD est installée dans le slot dédié, directement sur la carte. Ce dispositif de réception reçoit les données d’un émetteur qui envoie des trames de 10 octets. Pour être plus précis, ma trame est construite comme suit:
255 + 9 octets (sous forme de char). Une trame est émise toutes les 100 ms, chaque octet est envoyé à une vitesse de 4,8 kbit/s.

La mission du récepteur est simplement de capter les données et de les écrire sur la carte SD.

Pour les 100-110 premiers octets (10/11 premières trames) ça marche nickel. J’ai bien 255 + 9 char. Passé ces 10 trames, je n’obtiens plus que des erreurs. J’obtiens des trames qui ont une taille inférieure à 10 octets (souvent 5-6 octets). J’ai fait les tests plusieurs fois, toujours en prenant soin d’effacer les données enregistrées sur ma carte SD ,et j’obtiens toujours ce blocage après 10-11 trames.

Je souhaitais savoir si quelqu’un avait un avis sur cela (un buffer je ne sais où que je ne maîtrise pas, une erreur dans mon code etc…).

Je vous remercie par avance et bonne journée !

Ardui_Ecriture_Carte.ino (890 Bytes)

Postez le code en ligne en utilisant les tags de code, pas lisible simplement depuis un mobile si mis en pièce jointe

bonjour,
je n'ai pas regardé la vitesse d'écriture sur la SD, mais des datas avec ouverture et fermeture du fichier toutes les 100ms, ca me parait trop élevé.
après il y a un soucis de buffer, il faudrait l'utiliser pour stocker les datas, puis écrire sur la SD.
tant que le buffer n'est pas plein ou ne contient pas un caractère spécial, on ne fait rien.
une fois plein ou ce caractère recu, on écrit sur la SD.

J-M-L:
Postez le code en ligne en utilisant les tags de code, pas lisible simplement depuis un mobile si mis en pièce jointe

Bonjour,

Voici mon code directement dans le post:

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

File fichierTxT;

void setup() {

Serial.begin(4800);

//Pour la carte SD=====================
if(!SD.begin(4)) {
return;
}
pinMode(10, OUTPUT);
//File creation
fichierTxT= SD.open(“test.txt”, FILE_WRITE);
fichierTxT.close();
}

//To get my received data
char receptChar;

void loop() {
//Opening of the file
fichierTxT = SD.open(“test.txt”, FILE_WRITE);

//Check if the Serial port is available
while(Serial.available()<=0){}

//Get the data from the Serial port
receptChar = Serial.read();

//Check if the SD file is available
if (fichierTxT){

//Write the byte into the file
fichierTxT.print(receptChar );

//Save and close the data

fichierTxT.flush();
fichierTxT.close();

}
else {
Serial.println(“Error, SD not available”);
fichierTxT.close();

}

}

Je l’ai un peu changé par rapport à la pièce jointe. En effet au lieu d’attendre que le port série soit disponible, je rentre dans une boucle while tant que le port série est INdisponible, et j’écris sur la carte lorsque nous ne respectons pas cette condition.

infobarquee:
bonjour,
je n'ai pas regardé la vitesse d'écriture sur la SD, mais des datas avec ouverture et fermeture du fichier toutes les 100ms, ca me parait trop élevé.
après il y a un soucis de buffer, il faudrait l'utiliser pour stocker les datas, puis écrire sur la SD.
tant que le buffer n'est pas plein ou ne contient pas un caractère spécial, on ne fait rien.
une fois plein ou ce caractère recu, on écrit sur la SD.

Bonjour,

En effet, la carte ne semble pas suivre. Après avoir changé le programme d'émission, en faisant passer le délai de 100ms à 180ms, la carte ne fait plus d'erreur. Cependant, ce que je ne comprends pas c'est lorsque nous émettons toutes les 100ms, pourquoi cela marche au début et plus après ?

d'après moi ca ne suis plus car trop rapide et le buffer n'a pas le temps de se vider avant la volée suivante.