Problème de vitesse d'écriture sur carte sd tous les 750ko

Bonjour, je vous contacte car j'ai un problème d'écriture sur carte SD. Le but de mon programme est de datalogger des données d'un capteur arrivant par RS232. Mon soucis est que j'ai des pertes de data tout les 750ko écrient dans mon programme. J'ai donc écrit une boucle d'écriture de 512 octets sur la carte sd en mesurant le temps d'écriture :

char buff[512];
        long time = millis();
        dataFile.write(buff, 512);
        dataFile.flush();
        time = millis()-time;
        Serial.println(time);

Avec ce code et le moniteur série on voit très bien le temps augmenter régulièrement. Ma carte est une Arduino Due et je compile avec la version 1.5.8. Avez vs le même problème avec mon code? Savez vs d’où cela peut venir? Merci d'avance.

Salut,

Pas clair ton histoire ... augmenter régulièrement avec quoi ? comment ces pertes de data se manifestent-elles ?

En fait le temps d'écriture est d'environ 9ms pour les 512octets mais tous les 750ko il passent à 140ms pendant 2 ou 3 écritures puis repart à 9ms. Dans mon programme, j'ai un buffer RS232 de 1024octet que je transfert au fur et mesure sur ma carte SD. Tout se passe bien sauf quand j'arrive vers les 750ko au là il se rempli et reste plein pendant quelques millisecondes avant de se revider normalement. Les pertes de data sont à ce moment là, lorsqu'il est plein.

Tu n'as pas mis en place de protocole de vérification ? Dans tout les protocole de communications robuste il y a un système d'acknowledgement. Il s'agit simplement de faire en sorte que le récepteur signale qu'il a bien reçu le précédente paquet et est bien apte à en recevoir un autre.

Concrètement dans ton cas cas il faudrait un protocole comme ça :

Emetteur => "Es-tu prêt à recevoir x paquets?" Récepteur => "oui" Emetteur => envoi paquet n°1 et attend Récepteur => "paquet bien reçu, tu peux m'en envoyer un autre!" etc ... jusqu'à paquet x-1

Au moins la tu es sûr que l'Arduino est prête à recevoir

OK pour les acknowledges mais le soucis est que mon capteur est une centrale inertielle qui envoi en continu sans demande dc pas acknowledges. Je viens d'essayer avec une carte SD class 10 et plus de soucis. Ma précédente carte était en classe 4.

Dans ce cas une mémoire tampon.

Suivant la criticité de ton projet je te conseille quand même d'appliquer ces point sur la class 4. Si ça fonctionne avec, après t'es sur et certain qu'en class 10 le problème ne se présentera pas

Ouai c'est ma seule solution. Et avez vous le même problème avec le code que j'ai donné? Il suffit de l'intégré dans l'exemple datalogger de arduino, en déclarant l'ouverture du fichier datafile en dehors de la loop.

J'ai pas de quoi testé sous la main mais ça ne me surprend que moyennement, la lib est asse zcomplexe, y'a plein de d'histoire de mémoire tampons ... Il suffit d'arriver à une certaine limites pour déclencher des écritures de blocs etc ... Et donc d'un coup ça prend plus de temps