Vitesse acquisition des données via UART (moniteur série)

Bonjour,

J'ai réalisé un programme sur PC qui envoi des octets par paquet de 128 sur le port série du pc (enfin ici c'est le cable usb de l'arduino) . Aucun problème de ce côté là.

Sur l'arduino uno j'ai un petit programme qui récupère ces octets pour les charger dans un tableau. Ce programme fonctionne bien mais est trop lent à cause du temps nécessaire entre chaque octet reçu.

En effet je suis obligé, du côté du programme pc, de respecter un temps mort de 1seconde entre chaque octets envoyés sans quoi ça ne marche pas(le tableau ne se rempli pas à part le premier élément qui se trouve avec une valeur etrange).

voici mon petit sketch arduino:

int UserBtn = 7;

int i = 0;
int page_buff[128] ;          // buffer page eeprom

String chaine_rx = String();  // chaine de réception UART
int val_rx = 0;               // valeur de réception issue de chaine_rx 
int k = 0;
//--------------------------------------------------
//           AFFICHER BUFFER 128 OCTETS            -
//--------------------------------------------------
void display_pbuff(void)
{
    for (i=0; i < 128; i++)
    { 
      Serial.print(i); 
      Serial.print(" : ");
      Serial.println(page_buff[i]);
    }
}


//--------------------------------------------------
//           INITIALISATION                        -
//--------------------------------------------------
void setup() 
{          
    pinMode(UserBtn, INPUT);  
    Serial.begin(9600);
    delay(10); 
    Serial.println("EEPROM PROGRAMMER");    
}


//--------------------------------------------------
//           BOUCLE PRINCIPALE                     -
//--------------------------------------------------
void loop() 
{
    int inval = digitalRead(UserBtn);
    if (inval == LOW)
    {
       display_pbuff();                  // afficher buffer sur appui du bouton
       delay(100); 
    }
  
    if (Serial.available() > 0)         // quand on reçois un octet
    {
      chaine_rx = Serial.readString();  //stock chaine dans chaine_rx
      val_rx = chaine_rx.toInt();       // transformation en valeur numérique
              
      page_buff[k] = val_rx;            // remplir le buffer
      if (k < 128) {k = k + 1;}         // ne pas déborder
      if (k == 128) {Serial.println("ack");}
      
    }
}

une idée ?

merci.

Bon bah c'est bon.
C'est avec Serial.setTimeout() qu'on peut régler ça. Par défaut c'est à 1000ms, ce qui explique tout.

Je vais peut-être écrire des bêtises.
Tant pis, on me corrigera, j'aurai appris quelque chose.....

Je ne suis pas sûr que Serial.readString() soit la méthode la plus optimisée.
Apparement, elle se termine uniquement sur un timeout.
Donc on doit perdre beaucoup de temps à attendre des timeout.
J'utiliserai plutôt Serial.read(), pour une lecture octet par octet.

while (Serial.available())         // quand on reçois un octet
{
...
  c=Serial.read()
...
}

Autre débat, toujours pour ma culture perso.
Tu envoies 128 octets de données que tu stockes dans un tableau de 128 entiers, donc 256 octets.
Tu utilises un espace mémoire rempli à moitié de données réelles.

Voilà, j'attends de me faire corriger..... ::slight_smile:

Je continue :
Utiliser String pour travailler sur des octets, c'est pas too much ?