Problème : Traitement de +1000 caractères

Bonjour, Je suis sur Arduino Méga 2560 (115200 bauds), je dois envoyer, via le port série, plus de 1000 caractères (Max : 6000) mais la carte Arduino ne traite que 368 sur 1000 et 899 pour 6000.

Quelqu'un pourrait m'éclairer là dessus ?

Qu'est-ce qui te fait dire que la carte ne traite que 368 sur 1000 et 899 pour 6000?

Tous simplement en récupérant les données avant et après le passage par la carte.

Tu veux dire que tu balances des données à 115200 dans l'arduino et que tu les renvois à la même vitesse? Tu peux mettre ton code? Et expliquer comme l'ensemble fonctionne. Rythme d'arrivée des données, flux ininterrompu, salve de données, données étalées dans le temps?

Brice_B: Bonjour, Je suis sur Arduino Méga 2560 (115200 bauds), je dois envoyer, via le port série, plus de 1000 caractères (Max : 6000) mais la carte Arduino ne traite que 368 sur 1000 et 899 pour 6000.

Quelqu'un pourrait m'éclairer là dessus ?

bonjour Je suppose que tu ne fait pas qu'une simple duplication uart hard vers uart hard avec ta mega ? - Probleme de buffer ? - incorporation de latence ? - autres ? poste ton code

Pour expliquer un peu, je dois faire communiquer une tablette et un smartphone via Arduino, l'envoi et la réception de données je le fait avec visual studio afin de simuler mes 2 appareils.

char octetReception=0;
char Reception=0;
String TrameReception="";
bool DbTrame = 0;


boolean TG_Passerelle() //sous-programme pour la communication entre la TG et la passerelle
{
  if (Serial.available()>0) // tant qu'un octet en réception depuis la tablette
  {
    TrameReception=""; // RAZ de la variable TrameReception
    Reception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
    if (Reception == 2 && DbTrame == 0) //vérifie que le 1er octet est un char(2) (début de trame)
    {
      DbTrame = 1; //
    }
    while(DbTrame == 1)
    {
      octetReception=Serial.read(); //Lit l'octet suivant et le place dans la variable octetReception
      if (octetReception >= 48)
      {
        TrameReception= TrameReception + octetReception; //Ajout de l'octet dans la variable TrameReception
      }
      else if (octetReception == 30) // .. sinon, si la valeur de octetReception est 30 (char(30), espace) alors ..
      {
        TrameReception= TrameReception + " "; //ajoute l'espace à la suite de TrameReception
      }
      else if (octetReception == 3) // si la valeur de octetReception est 3 (char(3), fin de trame) alors ..
      {
        DbTrame = 0;
        Serial.println ("Donnee envoyer vers le smartphone = "+TrameReception); //Afficher la trame à envoyer
        Serial1.println ("Donnee recue depuis le master = "+TrameReception); //Envoie et affichage de la trame vers le smartphone
      }
    }
  }
}

boolean smart_passerelle()//sous-programme pour la communication entre le smartphone et la passerelle
{
  if (Serial1.available()>0) // tant qu'un octet en réception depuis la tablette
  {
    TrameReception=""; // RAZ de la variable TrameReception
    Reception=Serial1.read(); // Lit le 1er octet reçu et le met dans la variable
    if (Reception == 2 && DbTrame == 0) //vérifie que le 1er octet est un char(2) (début de trame)
    {
      DbTrame = 1;
    }
    while(DbTrame == 1)
    {
      octetReception=Serial1.read(); //Lit l'octet suivant et le place dans la variable octetReception
      if (octetReception >= 48) // si la valeur de octetReception est 3 (char(3), fin de trame) alors ..
      {
        TrameReception= TrameReception + octetReception; //Ajout de l'octet dans la variable TrameReception
      }
      else if (octetReception == 30) // .. sinon, si la valeur de octetReception est 30 (char(30), espace) alors ..
      {
        TrameReception= TrameReception + " "; //ajoute l'espace à la suite de TrameReception
      }
      else if (octetReception == 3) // si la valeur de octetReception est 3 (char(3), fin de trame) alors ..
      {
        DbTrame = 0;
        Serial.println ("Donnee recue depuis le smartphone = "+TrameReception); //Afficher la trame à envoyer
        Serial1.println ("Donnee envoyer vers le master = "+TrameReception); //Envoie et affichage de la trame vers le smartphone
      }
    }
  }
}

void setup()   
{
  Serial.begin(115200, SERIAL_8N1); //Communication entre Tablette et Arduino
  Serial1.begin(115200, SERIAL_8N1); //Communication entre smartphone et Arduino
  Serial.println("COMMUNICATION ETABLIE");
}
void loop()
{
  TG_Passerelle(); //Appel du sous-programme TG_Passerelle
  smart_passerelle(); //Appel du sous-programme smart_Passerelle
}

Est-ce que les données sont trop vite traité et ça serai pour cela que ça fonctionne mal ?

L'émission des caractères est faite sous interruption, et le buffer est petit (64 octets pour une MEGA).

Je pense que tu devrais utiliser Serial.flush() entre chaque trame. flush() permet d'attendre que l'émission soit terminée.

D'accord, merci !

    if (Reception == 2 && DbTrame == 0) //vérifie que le 1er octet est un char(2) (début de trame)
    {
      DbTrame = 1;
    }
    while(DbTrame == 1)
    {
      octetReception=Serial.read(); //Lit l'octet suivant et le place dans la variable octetReception
....

Là c'est pas bon. Si tu trouves le caractère 2 tu entres dans while et tu lis de nouveau Serial sans avoir vérifié qu'il y avait un caractère dans le buffer de réception.

L'usage de la classe String pour manipuler des chaines de caractères n'est sans doute pas une bonne idée. Cette classe consomme de la mémoire et des ressources (allocation dynamique de mémoire par exemple) alors qu'en fin de compte tu te contentes de placer les caractères reçus dans un buffer avant de les renvoyer.

On peut d'ailleurs se poser la question de la pertinence du stockage intermédiaire. J'ai rapidement parcouru le code (j'ai donc pu passer sur quelque chose un peu trop vite) et de ce que je vois tu fais un filtrage basique caractère imprimable ou caractère de contrôle. Ce traitement pourrait être fait à la volée sans stockage ce qui serait certainement le plus efficace.