Probleme liaison serie (vitesse)

Salut a tous,

j’ai un petit projet en cours, j’ utilise un uno, avec shield mémoire, dont je n’ utilise que la partie lecteur SD

sur la SD, un fichier texte, contenant une animation ASCII (star war), le uno lit le fichier sur la SD, et l’ envoie

sur un terminal DEC VT420 , un vrai terminal des années 90…

Et le probleme est : jusqu’à 19200 bauds, pas de soucis, mais l’animation est trop lente sur le terminal.

Donc je voudrais passer a 38400 bauds, la vitesse max du terminal, et la celui ci affiche bien la premiere moitie

de page, environ une bonne centaine de caractères et apres plein de points d’ interogation, bref du grand nimporte quoi !

sur le terminal je peut paramétrer Xon, Xoff a 64 , 128 ou rien… et je pense que le Pb viens de la

l’ arduino ne gere pas Xon,Xoff, aucun contrôle de flux

Voici mon code :

/*
   SD card file dump
   Animation Star_Wars  (SD)
  Modifications C.Chazottes (2014)
  
  
  This example shows how to read a file from the SD card using the
  SD library and send it over the serial port.
     
  The circuit:
  * SD card attached to SPI bus as follows:
  ** MOSI - pin 11
  ** MISO - pin 12
  ** CLK - pin 13
  ** CS - pin 10
  
  created  22 December 2010
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
  
  This example code is in the public domain.
      
  */

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
 const int chipSelect = 10;

void setup()
{
  // Open serial communications and wait for port to open:
   Serial.begin(19200);
      
 // Initialise le Terminal
 // Efface l'ecran, et curseur position 0,0
 
    Serial.print(F("\x1b\[H")); 
    Serial.print(F("\x1b[2J"));
   
   delay(1000);
   
   Serial.println("       Animation ASCII sur le theme: ");
   Serial.println();
   Serial.println();
   Serial.println();
   Serial.println("                          8888888888  888    88888");
   Serial.println("                         88     88   88 88   88  88");
   Serial.println("                          8888  88  88   88  88888");
   Serial.println("                             88 88 888888888 88   88");
   Serial.println("                      88888888  88 88     88 88    888888");
   Serial.println();
   Serial.println();
   Serial.println();
   Serial.println("                      88  88  88   888    88888    888888");
   Serial.println("                      88  88  88  88 88   88  88  88");
   Serial.println("                      88 8888 88 88   88  88888    8888");
   Serial.println("                       888  888 888888888 88   88     88");
   Serial.println("                        88  88  88     88 88    8888888");
   Serial.println();
   Serial.println();
   Serial.println("                                      Adaptation Arduino C.Chazottes 2014");
   Serial.println(); 
   Serial.println();
   Serial.print("  Initialisation Carte SD...       ");
   delay(3000);
   // make sure that the default chip select pin is set to
   // output, even if you don't use it:
   pinMode(10, OUTPUT);
   
   // see if the card is present and can be initialized:
   if (!SD.begin(chipSelect)) {
     Serial.println("Carte Illisible, ou Absente.");
     // don't do anything more:
     return;
   }
   Serial.println("carte initialisee.");
   delay(3000);
   
     
   // open the file. note that only one file can be open at a time,
   // so you have to close this one before opening another.
   File dataFile = SD.open("star.txt");

   // if the file is available, write to it:
   if (dataFile) {
     while (dataFile.available()) {
       Serial.write(dataFile.read());
     }
     dataFile.close();
   }  
   // if the file isn't open, pop up an error:
   else {
     Serial.println("                 Erreur ouverture fichier: star.txt");
   } 
}

void loop()
{
}

pour ceux qui voudraient mon fichier texte, il est dans la rubrique projets finis, ou j’ ai posté un peu tot !!!

Voila, si vous avez des idees…

a++
Christian

christianc: ... Donc je voudrais passer a 38400 bauds, la vitesse max du terminal, et la celui ci affiche bien la premiere moitie

de page, environ une bonne centaine de caractères et apres plein de points d' interogation, bref du grand nimporte quoi !

sur le terminal je peut paramétrer Xon, Xoff a 64 , 128 ou rien...... et je pense que le Pb viens de la

l' arduino ne gere pas Xon,Xoff, aucun contrôle de flux

... Voila, si vous avez des idees.......

a++ Christian

Bonjour ça ressemble effectivement à un probleme de buffer sur ton VT tu a testé sur un emulateur de VT ? avant de t'engager sur la la gestion du XON/XOFF essaie de tester un delay d'emission variable entre caractere à 38400, c'est pas beau, mais selon la valeur tu va voir si ça coince plus loin ou pas, genre

Serial.write(dataFile.read());
Delay(T)  ou un DelayMicroseconds(T)

perso je mettrais en setup une petite acq analogique avec un potentiometre pour charger la valeur du delai un petit test dychotomique sur la position du potentiometre suivi d'un reset

Merci Artouste pour cette réponse rapide,

Je connaissait l’ instruction Delay, mais pas DelayMicroseconds,

et avec un Delay(1) dans la boucle principale c’ étais beaucoup trop lent !!!

je viens de faire une série d’ essais et la meilleure valeur est de 385 Microseconds dans la boucle principale

et la cela fonctionne Nickel, j’ ai gagne 3min10s sur la lecture totale du fichier

Une petite idée, pourrais t’on mettre une boucle imbriquée dans la boucle de lecture,
afin de n’ envoyer la tempo que tout les 25 ou 50 caractères, juste avant que le buffer
du terminal soit plein, Valeur a déterminer par essais successifs

Mais la je ne voit pas comment écrire cette boucle imbriquée,

Voici le code actuel:

/*
   SD card file dump
   Animation Star_Wars  (SD)
  Modifications C.Chazottes (2014)
  
  
  This example shows how to read a file from the SD card using the
  SD library and send it over the serial port.
     
  The circuit:
  * SD card attached to SPI bus as follows:
  ** MOSI - pin 11
  ** MISO - pin 12
  ** CLK - pin 13
  ** CS - pin 10
  
  created  22 December 2010
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
  
  This example code is in the public domain.
      
  */

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
 const int chipSelect = 10;

void setup()
{
  // Open serial communications and wait for port to open:
   Serial.begin(38400);
      
 // Initialise le Terminal
 // Efface l'ecran, et curseur position 0,0
 
    Serial.print(F("\x1b\[H")); 
    Serial.print(F("\x1b[2J"));
   
   delay(1000);
   
   Serial.println("       Animation ASCII sur le theme: ");
   Serial.println();
   Serial.println();
   Serial.println();
   delayMicroseconds(500);
   Serial.println("                          8888888888  888    88888");
   Serial.println("                         88     88   88 88   88  88");
   Serial.println("                          8888  88  88   88  88888");
   Serial.println("                             88 88 888888888 88   88");
   Serial.println("                      88888888  88 88     88 88    888888");
   Serial.println();
   Serial.println();
   Serial.println();
   delay(100);
   Serial.println("                      88  88  88   888    88888    888888");
   Serial.println("                      88  88  88  88 88   88  88  88");
   Serial.println("                      88 8888 88 88   88  88888    8888");
   Serial.println("                       888  888 888888888 88   88     88");
   Serial.println("                        88  88  88     88 88    8888888");
   delayMicroseconds(1000);
   Serial.println();
   Serial.println();
   Serial.println("                                      Adaptation Arduino C.Chazottes 2014");
   Serial.println(); 
   Serial.println();
   delay(500);
   Serial.print("  Initialisation Carte SD......");
   delay(3000);
   // make sure that the default chip select pin is set to
   // output, even if you don't use it:
   pinMode(10, OUTPUT);
   
   // see if the card is present and can be initialized:
   if (!SD.begin(chipSelect)) {
     Serial.println("Carte Illisible, ou Absente.");
     // don't do anything more:
     return;
   }
   Serial.println("   Carte initialisee.");
   delay(3000);
   
     
   // open the file. note that only one file can be open at a time,
   // so you have to close this one before opening another.
   File dataFile = SD.open("star.txt");

   // if the file is available, write to it:
   if (dataFile) {
     while (dataFile.available()) {
       Serial.write(dataFile.read());
     delayMicroseconds(385);  
   }
     dataFile.close();
   }  
   // if the file isn't open, pop up an error:
   else {
     Serial.println("                 Erreur ouverture fichier: star.txt");
   } 
}

void loop()
{
}

a++
Christian

PS: avec un terminal logiciel, moniteur série de l’ide arduino ou un vieux procomm sur un portable sous dos
pas de problèmes, mais je pense que un terminal logiciel est toujours plus rapide que mon vieux VT420

christianc: ... Une petite idée, pourrais t'on mettre une boucle imbriquée dans la boucle de lecture, afin de n' envoyer la tempo que tout les 25 ou 50 caractères, juste avant que le buffer du terminal soit plein, Valeur a déterminer par essais successifs

Mais la je ne voit pas comment écrire cette boucle imbriquée,

Je ne saisi pas bien l'interet de la manip mais pas la peine de creer une boucle tu incremente un compteur de caracteres lus et tu test si "nb caracteres lus" modulo "taille ton buffer" = 0 tu envoie un delai de X.

Slt artouste,

Dans mon esprit, le fait de mettre une tempo tout les 25 ou 50 caractères,

serais de gagner en vitesse, je pense qu' avec une tempo tous les x caractères plutôt qu' a chaque

me permettrais d' aller un peu plus vite, je teste des que j' ai un moment

a+++