Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Auteur Sujet: Problème limite de Serial 64 bit  (Lu 2388 fois)

maximeh

  • Newbie
  • *
  • Messages: 26
  • j'adore découvrir le potentiel de toutes choses
    • Voir le profil
Problème limite de Serial 64 bit
« le: Novembre 24, 2023, 05:18:37 am »

J'ai besoin de transférer par serial entre un esp01s et un Arduino nano une message comme celui ci :2300_1111_3400_5012_4500_8913_5600_12814_6700_16715_7800_20616_8900_24517_10000_28418_11100_32319_12200_36220_13300_40121_11.
il peut être indéfiniment plus long ou plus petit.

avec la façon standard ci dessous c'est limité a 64, du coup comment faire pour que je puisse envoyer un tel message par serial? un grand merci d'avance

 if (Serial.available() > 0) 
 {
 
   
   String recData = " ";
    String recData2 = " ";
 
   while(Serial.available())
   {
     char c = Serial.read();
     if (Serial.available() > 0)
     {
       
     recData += c;
       
     delay(10);
     
   }
IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #1 le: Novembre 24, 2023, 09:54:30 am »

Bonjour,

Tu ne dis pas quelle est la vitesse de transmission, mais avec ton delay de 10ms tu satures sans doute le buffer de réception. A 115200 bauds un caractère est transmis toutes les ms, donc à  chaque caractère reçu tu bloques la lecture du buffer de réception pendant la durée de réception de 10 caractères.
Une petite remarque: tu définis recData dans le if {} donc la variable n'existera plus à  la sortie du if, donc soit il faut faire le traitement dans le if soit il faut définir la variable en dehors du if.


Pour la réception ru peux faire quelque chose comme ça.
  String recData;
 
  if (Serial.available() > 0) {
    int c;
    while (c = Serial.read()) {
      recData += char(c);
    }
  }
« Modifié: Novembre 24, 2023, 11:16:40 am par kamill »
IP archivée

eric29

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #2 le: Novembre 24, 2023, 10:12:18 am »

Bonjour,
Je n'ai pas de réponse directe mais, de mon point de vue, il y aurait 2 pistes à  creuser, en complément de la réponse de @kamill :
1/ voir si la valeur par défaut de longueur de transmission de message peut être modifiée... Bon, je ne suis pas certain que cela corresponde à  ton besoin compte tenu des grandes variations de longueur de tes messages.

2/ gérer toi même l'envoi des séquences : par exemple en considérant que chaque nombre constitue une séquence et est une suite de caractères ayant une longueur fixe, 6 par exemple : pour 8913, on transmet 008913, et tu gères une séquence de début (par exemple _START) et une séquence de fin (i.e. _END__). Charge à  l'unité qui reçoit de reconstituer le message complet.

Je suis aussi d'accord sur le fait que l'utilisation de delay() n'est pas nécessaire et est même probablement préjudiciable ici.

Bon, ce n'est qu'une idée, mais je pense que c'est faisable.
Eric
IP archivée

maximeh

  • Newbie
  • *
  • Messages: 26
  • j'adore découvrir le potentiel de toutes choses
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #3 le: Novembre 25, 2023, 02:50:31 am »

Un grand merci pour vos réponses.
J'ai pensé effectivement de couper le string et d'envoyer l'un après l'autre.

j'envois comme ça;

String myArrayStr[50];

void setup()
{
  Serial.begin(9600);
  pinMode(4, INPUT_PULLUP); 


void loop()
{
if (digitalRead(4) == LOW) {
    String str1 ="123422125472";
    int nb_order = str1.length() /6 ;
    for (int i = 0; i < nb_order; ++i) {
    myArrayStr = str1.substring(0 ,7);
    Serial.print(myArrayStr);
    str1.remove(0,7);
    delay(400); 
    }}}
 

mais le problème c'est au niveau de la réception

void setup()
{
  Serial.begin(9600); 


void loop() { 
if (Serial.available() > 0) 
  {   
    String recData = " "; 
    while(Serial.available())
    {
      char c = Serial.read();
        recData += c;   
      delay(10);     
    } 
    Serial.println(recData);
}}

c'est idiot, j'ai trouvé la olution dans l'exemple serial event dans arduino

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
   
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

il faut juste que j'envoi un Serial.println(); a la fin de mon envoi pour que le receveur sache que j'ai fini.

un grand merci encore de votre attention.


« Modifié: Novembre 25, 2023, 09:19:52 am par maximeh »
IP archivée

maximeh

  • Newbie
  • *
  • Messages: 26
  • j'adore découvrir le potentiel de toutes choses
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #4 le: Novembre 25, 2023, 03:57:14 am »

et pour finir j'ai modifié pour ne pas être limité au niveau de la taille max d'un string en mettant dans un tableau

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
int toto = 0;
String arraystring[50];
void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
   
    Serial.println(arraystring[1]);
    Serial.println(arraystring[2]);
    Serial.println(arraystring[3]);
    inputString = "";
    toto = 0;
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
     if (inputString.length() == 7) {
      arraystring[toto] = inputString;
      inputString.remove(0,7);
      toto++;
    }
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
« Modifié: Novembre 25, 2023, 07:34:13 am par maximeh »
IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #5 le: Novembre 25, 2023, 09:52:51 am »

Ca ne sert pas à  grand chose de poser des questions si tu ne tiens aucun compte des réponses.

Je vais être un peu dur, mais ton programme est à  la limite du grand n'importe quoi.
- pourquoi déclarer un tableau de 50 String ??
- pourquoi découper la réception en blocs de 7 caractères ?? pourquoi pas 6 ou 8 ou 50 ?
- pourquoi afficher seulement les trois premier blocs ?? Que se passe t'il si tu reçois plus de 21 caractères ?
- ...

Tu n'avais pas précisé que le message était terminé par \n. Dans ce cas c'est très simple
  String inputString;

  if (Serial.available())
  {
    inputString=Serial.readStringUntil('\n');
    Serial.println(inputString);
  }
« Modifié: Novembre 25, 2023, 09:56:54 am par kamill »
IP archivée

maximeh

  • Newbie
  • *
  • Messages: 26
  • j'adore découvrir le potentiel de toutes choses
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #6 le: Novembre 25, 2023, 02:59:45 pm »

Hello Kamill

Merci pour tes questions.

Pourquoi 50, je peux te répondre pourquoi pas 200 ou plus.

Désolé mais en même temps que je pose une question je recherche la solution, j'ai justement indiqué que j'avais aussi pensé a un moment découper le string et les envoyer séparément afin de ne pas atteindre les 64 caractères maximum apparemment.

Pourquoi 7 ben c'est en fait 6 digits car dans la fonction remove() tu dois faire nombre de caractères +1 donc 7 c'est en fait le nombre de pas de deux stepper sur un véhicule ROV, donc de -99999 à  999999.

Si j'ai fait ces 3 Serial-print c'est juste pour me démontrer que ca fonctionne. maintenant c'est ca :

if (stringComplete) {
   

 long positions[2];

  stepper_driver.initialize();
  int titi = 0;
  for (int i = 0; i < toto /2; ++i) {
  positions[0] = arraystring[titi];
  titi++;
  positions[1] = arraystring[titi];
  titi++;

  steppers.moveTo(positions);
  steppers.runSpeedToPosition();
  stepper1.setCurrentPosition(0);
  stepper2.setCurrentPosition(0);

}
    inputString = "";
    toto = 0;
    stringComplete = false;
}}



Vraiment désolé de ne pas vous donner tout le code, c'est pas pour une histoire que je veux pas partager mais les autres paramètres n'ont aucune influence sur ce problème que j'avais.

Je te remercie infiniment pour "inputString=Serial.readStringUntil('\n');"

Quels sont tes langages que tu maitrises?

IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Re : Problème limite de Serial 64 bit
« Réponse #7 le: Novembre 25, 2023, 03:32:49 pm »

Pourquoi 7 ben c'est en fait 6 digits
Ca ne correspond pas au message dans ton premier post. Chaque champ avait un nombre de digits variable.

  positions[0] = arraystring[titi];
Tu es sur que ça compile?
En supposant que arrastring[titi] contient bien la bonne chaîne de caractère, la bonne formulation serait
  positions[1] = atol(arraystring[titi].c_str());
ou
  positions[1] = arraystring[titi].toInt();


« Modifié: Novembre 25, 2023, 04:17:36 pm par kamill »
IP archivée

maximeh

  • Newbie
  • *
  • Messages: 26
  • j'adore découvrir le potentiel de toutes choses
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #8 le: Novembre 25, 2023, 04:27:44 pm »

Ca ne correspond pas au message dans ton premier post. Chaque champ avait un nombre de digits variable.

réponse : comme expliqué, j'ai cherché une solution après avoir posé la question et après réflexion j'ai compris que j'avais besoin de 6 digit, avec 3600 pas ils font 201.34 mm

Tu es sur que ça compile?
En supposant que arrastring[titi] contient bien la bonne chaîne de caractère, la bonne formulation serait

réponse : ce code fonctionne à  merveille.je peux maintenant envoyer le nombre de positions des 2 moteurs comme je veux. plus limité a 64 charactères.
               arraystring[titi]; est int   j'ai laissé string dans le nom mais c'est int
               converti dans void serialEvent
                if (inputString.length() == 7) {
                 arraystring[toto] = inputString.toInt();
                 inputString.remove(0,7);
                 toto++;
    }
 
IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #9 le: Novembre 25, 2023, 06:53:30 pm »

Content que ça fonctionne
IP archivée

maximeh

  • Newbie
  • *
  • Messages: 26
  • j'adore découvrir le potentiel de toutes choses
    • Voir le profil
Re : Problème limite de Serial 64 bit
« Réponse #10 le: Novembre 26, 2023, 06:32:39 am »

Ouf je ne comprenais pas pourquoi 7 quand 6 digit pour remove et substring

en fait le string est réceptionné par un http.request et a cause de ca il y a en plus du string 1 espace au début et à  la fin donc j'ai juste fait str.remove(0,1); str.remove(str.length() -1 ,str.length()); et maintenant les remove et substring sont bien 6 et plus 7

dernière modification..
au final a la place de mettre par exemple 002000 je mets __2000 c'est a cause de -02000 car avec _ ca donne _-2000, beaucoup plus claire, dans le code c'est bien entendu traité par la fonction replace(). inputString.replace("_", "");
pour les modérateurs ? j'ai pas mal de questions a poser lié à  des problèmes comme ca,  plus algorithmique que électronique mais c'est quand même sur des microcontrôleurs donc il me semble que c'est  lié du coup ou dois je les poster sur ce forum? aussi j'ai appris dans ce post que je vais prendre une grande attention aux questions et répondre a toutes.

 
« Modifié: Novembre 27, 2023, 04:23:55 am par maximeh »
IP archivée