Arduino mega & liaisons serie & latence

Bonjour,

Merci d'avance pour votre aide, malgré plusieurs heures de recherche je n'ai pas trouvé la solution a mon problème.

j'ai une Arduino nano qui me sert d'actionneur bas niveau pour des capteurs et moteurs et je veux lui envoyer des instructions et récupérer des infos via la liaison serie1 d'une MEGA et cela toutes les 100ms.

D'un autre coté j'aimerai faire un monitoring toutes les 500ms sur la liaison serie0 (USB) sur mon PC.

L'idée est de ne pas saturer la mega a envoyer et recevoir en permanence des données.

quand la nano reçoit le string "comP2 GPIO" et renvoie sur son tx un string de 8 zéro ou un du genre "01001110"



unsigned long TempsMEGA2NANO;
String RecupNANO;
String EnvoiNANO;

void setup() {
  // initialize both serial ports:
  Serial.begin(1000000);
  Serial1.begin(1000000);
  TempsMEGA2NANO = millis();
  EnvoiNANO = "comP2 R1_GPIO\n";
}

void loop() {
  if (millis() - TempsMEGA2NANO > 99) {
    TempsMEGA2NANO = millis();
    Serial.println("je suis dans le millis");
    Serial1.print(EnvoiNANO);
    Serial.print("voici le RecupNANO: ");
    Serial.println(RecupNANO);
    Serial.print("voici le millis(): ");
    Serial.println(TempsMEGA2NANO);
  }

  // read from port 1:
  if (Serial1.available()) {
    RecupNANO = Serial1.readString();
  }

  // read from port 0:
  if (Serial.available()) {
    EnvoiNANO = Serial.readString(); //oui oui c'est un faux RecupNANO
  }
}

Le probleme est que j'ai un fréquence de 1 seconde a la place des 100ms:
image
A la main depuis la console serie sur la nano seul j'arrive à aller plus vite...

Je suis preneur d'explication car là je suis face a un mur.

Merci!

Vincent

Bonjour,

Il n'y a rien qui dit que le message est terminé, donc la réception s'arrête à l'issue du timeout qui est par défaut de 1 s.
Il faut terminer ton message par un line feed (par exemple) avec println et utiliser Serial.readStringUntil('\n') ou mieux readBytesUntil()

merci beaucoup!!!
ca marche
code la mega:



unsigned long TempsMEGA2NANO;
String RecupNANO;
String EnvoiNANO;

void setup() {
  // initialize both serial ports:
  Serial.begin(1000000);
  Serial1.begin(1000000);
  TempsMEGA2NANO = millis();
  EnvoiNANO = "comP2 R1_GPIO\n";
}

void loop() {
  //delay(1000);
  if (millis() - TempsMEGA2NANO > 99) {
    TempsMEGA2NANO = millis();
    Serial.println("je suis dans le millis");
    Serial1.print(EnvoiNANO);
    Serial.print("voici le RecupNANO: ");
    Serial.println(RecupNANO);
    Serial.print("voici le millis(): ");
    Serial.println(TempsMEGA2NANO);
  }

  // read from port 1:
  if (Serial1.available()) {
    RecupNANO = Serial1.readStringUntil('\n');
  }

  // read from port 0:
  if (Serial.available()) {
    EnvoiNANO = Serial.readStringUntil('\n'); //oui oui c'est un faux RecupNANO
  }
}

code de la nano:


int valeurAleatoire = 1000;
unsigned long currentTime = 0;
unsigned long previousTime = 0;
bool ledState = LOW;
int result1 = 0;
int result2 = 0;
int length  = 0;
String toto ;
String R1_AX12[24]; // tableau pour stocker les élément
int Nb_max_variable_trame = 30;



void setup() {
  Serial.begin(1000000); // initialise la communication série à 9600 bauds
  pinMode(LED_BUILTIN, OUTPUT);

  R1_AX12[0] = random(0, 1027);
  R1_AX12[1] = random(0, 2);
  R1_AX12[2] = random(0, 1027);
  R1_AX12[3] = random(0, 2);
  R1_AX12[4] = random(0, 1027);
  R1_AX12[5] = random(0, 2);
  R1_AX12[6] = random(0, 1027);
  R1_AX12[7] = random(0, 2);
  R1_AX12[8] = random(0, 1027);
  R1_AX12[9] = random(0, 2);
  R1_AX12[10] = random(0, 1027);
  R1_AX12[11] = random(0, 2);
  R1_AX12[12] = random(0, 1027);
  R1_AX12[13] = random(0, 2);
  R1_AX12[14] = random(0, 1027);
  R1_AX12[15] = random(0, 2);
  R1_AX12[16] = random(0, 1027);
  R1_AX12[17] = random(0, 2);
  R1_AX12[18] = random(0, 1027);
  R1_AX12[19] = random(0, 2);
  R1_AX12[20] = random(0, 1027);
  R1_AX12[21] = random(0, 2);
  R1_AX12[22] = random(0, 1027);
  R1_AX12[23] = random(0, 256);
  R1_AX12[24] = random(0, 1027);
  R1_AX12[25] = random(0, 256);


}

void loop() {

  String R1_GPIO[10]; // tableau pour stocker les élément
  R1_GPIO[0] = random(0, 2);
  R1_GPIO[1] = random(0, 2);
  R1_GPIO[2] = random(0, 2);
  R1_GPIO[3] = random(0, 2);
  R1_GPIO[4] = random(0, 2);
  R1_GPIO[5] = random(0, 2);
  R1_GPIO[6] = random(0, 2);
  R1_GPIO[7] = random(0, 2);
  R1_GPIO[8] = random(0, 2);
  R1_GPIO[9] = random(0, 2);


  String ODO_ROBOT_1[3]; // tableau pour stocker les élément
  ODO_ROBOT_1[0] = random(0, 2001);
  ODO_ROBOT_1[1] = random(0, 3001);
  ODO_ROBOT_1[2] = random(0, 361);

  if (Serial.available() > 0) { // vérifie si des données sont disponibles sur la liaison série
    //Serial.println(' ');
    //readStringUntil
    String message = Serial.readStringUntil('\n'); // lit la chaîne de caractères sur la liaison série
    // Serial.println("Message reçu : " + message); // affiche le message reçu dans le moniteur série

    // sépare la chaîne de caractères en utilisant des espaces comme délimiteurs
    String elements[Nb_max_variable_trame ]; // tableau pour stocker les éléments
    int nbElements = 0; // nombre d'éléments trouvés
    int posDebut = 0; // position du début du prochain élément
    int posEspace = message.indexOf(' '); // position du premier espace
    while (posEspace != -1 && nbElements < Nb_max_variable_trame) { // tant qu'il reste des espaces et qu'on n'a pas atteint la taille maximale du tableau
      elements[nbElements] = message.substring(posDebut, posEspace); // extrait l'élément
      nbElements++; // incrémente le nombre d'éléments trouvés
      posDebut = posEspace + 1; // position du début du prochain élément
      posEspace = message.indexOf(' ', posDebut); // position du prochain espace
      //Serial.print("elements[nbElements]:");
      //Serial.println(elements[nbElements]);
    }
    // ajoute le dernier élément
    if (nbElements < Nb_max_variable_trame) {
      elements[nbElements] = message.substring(posDebut);
      nbElements++;

    }


    // vérifie si le premier élément est "comP2" et si le deuxième élément est "R1_GPIO"
    //    Serial.print("elements[0]:");
    //    Serial.println(elements[0]);
    //    Serial.print("elements[1]:");
    //    Serial.println(elements[1]);
    //    Serial.print("elements[2]:");
    //    Serial.println(elements[2]);
    if (elements[0] == "comP2" && elements[1] == "R1_GPIO") {
      //      Serial.print("comP2 R1_GPIO: "); // affiche la valeur aléatoire dans le moniteur série
      for ( int i = 0; i < 10; i++) {
        Serial.print(R1_GPIO[i]);
      }
      Serial.println("");
    }

    if (elements[0] == "comP2" && elements[1] == "R1_ODO") {
      Serial.print("comP2 R1_ODO "); // affiche la valeur aléatoire dans le moniteur série
      for ( int i = 0; i < 3; i++) {
        Serial.print(ODO_ROBOT_1[i]);
        Serial.print(' ');
      }
    }

    if (elements[0] == "comP2" && elements[1] == "R1_AX12") {
      Serial.print("comP2 R1_AX12 "); // affiche la valeur aléatoire dans le moniteur série
      for ( int i = 0; i < 25; i++) {
        R1_AX12[i] = elements[i + 2];
        //  Serial.print("i: ");
        //Serial.println( i);
        Serial.print(R1_AX12[i]);
        Serial.print(' ');
      }
    }


  }
  currentTime = millis();
  if ((currentTime - previousTime) > valeurAleatoire) {
    previousTime = currentTime;
    ledState = !ledState;
    digitalWrite(13, !ledState);
  }
}

le résultat:
Capture

je penses pas être le seul a avoir eu ce genre de mesaventure. dans les exemples Arduino ca serait bien d'avoir aussi avec plusieurs cartes.

Bonne journée

:+1: Bonne continuation.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.