Taille Buffer port Serie RX

Bonsoir,
Je n'ai pas réussi à trouver dans le Datasheet de ma MEGA2560 ou sur le forum quel était la taille du buffer du port série RX3.

Est existe-il un moyen d'augmenter sa taille ?

Merci

Dans la datasheet tu ne trouveras que ce qui concerne le matériel. Il y a juste un tampon de réception d'un octet.

Coté logiciel les définitions sont dans le fichier HardwareSerial.h du core arduino

#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif

Donc pour un processeur avec peu de mémoire c'est 16 octets pour les autres c'est 64.

A oui c'est petit... cela implique quoi si je change cette valeur dans HardwareSerial.h ?

Vu que c'est définit en fonction de la RAM je suppose que ça utilise plus de mémoire.

Mais si je l'augmente "beaucoup", 400 octets ne me manquerais pas beaucoup sur la Méga mais est-ce que cela va influer sur autre chose ?

ATTENTION cette valeur est utilisée pour toutes les instanciations de Serial. Si tu déclares plusieurs ports série tu utiliseras à chaque fois 400 octets. De plus cette valeur est utilisée pour allouer le buffer de réception et le buffer d'émission donc cela multiplie par 2 la mémoire consommée.

Maintenant, il ne faut pas se polariser sur la taille de ce buffer. Normalement, si ton code est bien écrit et que tu lis régulièrement les caractères reçus il ne doit pas se remplir beaucoup.

Ok donc double consommation de mémoire par port, c'est déjà plus ennuyeux.

C'est toujours pour ma trame teleinfo.
Le soucis est que j'ai quelques fonctions "bloquantes" dans mon sketch.
Par exemple à certain moment l'arduino envoi un email et cela bloque parfois quelques secondes le sketch ce qui me fait des trous dans ma trame récupérée avec serialevent. et donc l'arduino a du mal à ce resynchroniser avec un trop petit buffer.

Je vais changer de façon de récupérer mes info par teleinfo et ne traiter que ligne par ligne, pas la trame complète. comme ca je resterai avec le buffer normale

Plutôt que de jouer sur les buffer, pourquoi n'attends-tu pas un début de trame à chaque fois que tu as besoin de faire un relevé ? Peu importe le buffer, quand tu as besoin de lire une trame, tu attends le caractère de début et ensuite, tu lis la trame complète, tu traites les infos et tu passes à l'action suivante.

C'est ce que fait mon sketch jusqu’à maintenant mais la trame teleinfo est plutôt lente, environ 1.5 seconde pour une trame du début à la fin.

Le sketch gère le chauffage donc aussi le délestage de la maison donc je suis obligé de rafraichir souvent la valeur de l’intensité instantanée consommée.

Est du coup cela ralenti pas mal par exemple les temps de réponse des pages web qui sont affichés aussi par l'arduino.

Rien de grave mais en attendant que le buffer soit plein pour traiter tout ce qu'il y a dedans d'un coup cela devrait rend le sketch très réactif.

J'en suis là avec le buffer non modifié:

/*
Utilise le port serie RX3 de l'adruino MEGA
!! mettre une résitance de tirage de 4,7 kOhms entre Rx3 et VCC
*/

/*
Ce sketch n'est pas bloquant pendant la récupération de partie de Trame de la teleinfo :
il récupère le buffer du prot RX3 quand il est complet et il l'analyse dans Traite_teleinfo()
*/

long Index_HC=0;
long Index_HP=0;
byte I_A=0;
int P_W=0;
char PERIODE=' ';


void setup() {
  // Port série pour liasion Arduino <-> PC
  Serial.begin(9600);  
  // Port série pour liasion Arduino <-> Teleinfo
  Serial3.begin(1200); 
  
}

void loop() {

while (Serial3.available()>62) { // si le buffer du port serie RX3 est plein
  Traite_teleinfo();
}


}


void Traite_teleinfo() {

String Ligne="";

// Tant qu'il y a des données dans le buffer de RX3
    while (Serial3.available()) {
            char inChar = Serial3.read() & 0x7F;// lit chaque caratere dans buffer port serie RX3('& 0x7F' => Trame teleinfo en 7bit)
        //Attend le début d'une ligne   
            while (inChar != 0x0A) {// tans que l'on ne trouve pas de caractere de debut de ligne
                if (Serial3.available()) {
                    inChar = Serial3.read() & 0x7F;
                }
            }
        //Créé un String 'Ligne' avec les caractères jusqu'a la fin de ligne suivante
            while (inChar != 0x0D) {// tans que l'on ne trouve pas de carctere de fin de ligne
                if (Serial3.available()) {
                    inChar = Serial3.read() & 0x7F;
                    if (inChar != 0x0A && inChar != 0x0D) {// concatene les caratere de "Trame" sauf les caractere : début de ligne '0x0A'et fin de ligne '0x0D'
                      Ligne += inChar;
                    } 
                }
            }
           
        //controle le cheksum de la ligne
              char Controle=0;
              String check= Ligne.substring (0,Ligne.length()-2); // 'check' = Ligne - ses 2 derniers caractere
              for (byte i=0;i<(check.length());i++){
                Controle += Ligne[i];
              }  
              Controle = (Controle & 0x3F) + 0x20;
        //si le checksum et bon
              if (Controle == (Ligne[Ligne.length()-1])) {
        // Extrait la valeur de la ligne       
                if (Ligne.substring (0,4)=="HCHC") {
                    Index_HC = Ligne.substring (5,14).toInt();
                    Serial.println(Index_HC);
                }
                if (Ligne.substring (0,4)=="HCHP") {
                    Index_HP = Ligne.substring (5,14).toInt();
                    Serial.println(Index_HP);
                }
                if (Ligne.substring (0,4)=="PTEC") {
                  PERIODE = Ligne[6];
                  Serial.println(PERIODE);
                }
                if (Ligne.substring (0,4)=="IINS") {
                    I_A = Ligne.substring (6,9).toInt();
                    Serial.println(I_A);
                }
                if (Ligne.substring (0,4)=="PAPP") {
                    P_W      = Ligne.substring (5,10).toInt();
                    Serial.println(P_W);
                } 
              }
            Ligne=""; //Vide "Ligne"
    }
}

Je vais tester avec un buffer double puis triple si cela augmente le nombre d'info utiles récupérés en un buffer.