données tronquées lors de la lecture sur port COM

Bonjour à tous,

J’ai réalisé un module avec 6 pompes permettant de contrôler un circuit fluidique.
Le tout est contrôlé par un programme en VBNet permettant d’envoyer des commandes vers ma carte Arduino afin de contrôler l’allumage/extinction de mes pompes à des temps donnés.

Mon programme VBNet envoi des séquences du type : “POMPES,0,1,0,0,0,0” :

  • “POMPES” indique à Arduino le module à traiter
  • “0” ou “1” indique si la pompe doit être allumer ou éteinte

La plupart du temps, tout fonctionne très bien mais quelques fois, les commandes ne sont pas lues entièrement par l’Arduino : il lit “POM” ou “PES,0,1,0,0,0,0”, etc… et du coup les pompes ne sont pas allumées ou éteintes au bon moment !
Je ne comprends exactement où peut se trouver le problème mais d’après un logiciel de surveillance des échanges sur mon COM, les commandes sont correctement envoyées, je pense plutôt à un problème au niveau de ma “LOOP” sur l’Arduino ?

Voici mon code Arduino :

#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
#include <stdlib.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0); 

/*______Déclarations des Variables__________*/

  //Variables de réception commandes
  int Com1 = 0;
  int Com2 = 0;
  int Com3 = 0;
  int Com4 = 0;
  int Com5 = 0;
  int Com6 = 0;
  int Com7 = 0;
  int Com8 = 0;
  int Com9 = 0;
  String ComType = "";
  int Num;

  //controle des pompes
  int rpm1 = 5;                   // controle vitesse du moteur comprise entre 0 et 255 (PWM)
  int rpm2 = 6;
  int rpm3 = 7;
  int rpm4 = 8;
  int rpm5 = 9;
  int rpm6 = 10;
  int P1 = 40;                    // active le moteur 1.
  int P2 = 41;                    
  int P3 = 42; 
  int P4 = 43; 
  int P5 = 44;
  int P6 = 45;  
  
  //Boutons+Leds
  int pinBt_StandBy=31;
  int pinBt_Flush=30;
  int pinBt_Analyse=32;
  int pinLedR= 2 ; //PMW
  int pinLedG= 3;
  int pinLedB= 4;


/*__________Fonctions____________*/

//LED
  void displayColor(int r, int g, int b) 
  {
    // Version anode commune
    analogWrite(pinLedR, ~r);
    analogWrite(pinLedG, ~g);
    analogWrite(pinLedB, ~b);
  }

//POMPES
  void pompes( int Pompe1, int Pompe2, int Pompe3, int Pompe4, int Pompe5, int Pompe6)
  {              
    digitalWrite(P1,Pompe1); //active la pompe1
    digitalWrite(P2,Pompe2);
    digitalWrite(P3,Pompe3);
    digitalWrite(P4,Pompe4);
    digitalWrite(P5,Pompe5);
    digitalWrite(P6,Pompe6);
    analogWrite(rpm1,255); //définir vitesse pompe 255
    analogWrite(rpm2,255);
    analogWrite(rpm3,255);
    analogWrite(rpm4,255);
    analogWrite(rpm5,255);
    analogWrite(rpm6,255);
  }

//ECRAN
  void ecran(String ComType){
 
    u8g2.clearBuffer();          
    u8g2.setFont(u8g2_font_helvR18_tf);
    u8g2.drawStr(10, 25, ComType.c_str()); 
    u8g2.sendBuffer();         // affiche
    }

//LECTURE DONNEES PORT SERIE
void LectureSerie() {
  //On commence par déclarer une variable qui correspondra au cumul de caractères reçus
  String line = "";
  //On déclare une variable pour le caractère courant (celui qu'on vient de recevoir)
  char lastchar="";
  //Tant que le port série a des valeurs à nous transmettre et qu'on ne tombe pas sur un caractère de saut de ligne
  while(Serial.available() > 0 && lastchar != '\n') {
    //On lit le caractère depuis le port série
    lastchar = Serial.read();
    //Si c'est un saut de ligne, on quitte la boucle 
    if(lastchar == '\n') {
      Stockage(Num,line);  
      break;}
      // Si c'est une virgule, on stock les informations dans une variable
      if(lastchar == ',') {
        //Stockage dans ComType ou Com1, ou Com2...
        Stockage(Num,line);
        line = "";
        Num = Num + 1;
      }
      else{
        line += lastchar;
      }
  }

}

//Fonction permettant le stockage dans les variables commandes
void Stockage(int Val, String line){
  if(Val == 0){
     ComType = line;
  }
  if(Val == 1){
     Com1 = (line.toInt());
  }
  if(Val == 2){
     Com2 = (line.toInt());
  }        
  if(Val == 3){
     Com3 = (line.toInt());
  }
  if(Val == 4){
     Com4 = (line.toInt());
  }
  if(Val == 5){
    Com5 = (line.toInt());
  }
  if(Val == 6){
     Com6 = (line.toInt());
  }
}

  
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

   //écran
   u8g2.begin();
   ecran("Wait PC");

   //définition des modes
   pinMode(pinBt_StandBy, INPUT); //mode lecture pour le bouton
   pinMode(pinBt_Flush, INPUT); //mode lecture pour le bouton
   pinMode(pinBt_Analyse, INPUT); //mode lecture pour le bouton
   pinMode(pinLedR, OUTPUT); //mode écriture pour led1
   pinMode(pinLedG, OUTPUT); //mode écriture pour led2
   pinMode(pinLedB, OUTPUT); //mode écriture pour led2

   pinMode(rpm1, OUTPUT);         
   pinMode(rpm2, OUTPUT);
   pinMode(rpm3, OUTPUT);
   pinMode(rpm4, OUTPUT);
   pinMode(rpm5, OUTPUT);
   pinMode(rpm6, OUTPUT);
   pinMode(P1, OUTPUT);         
   pinMode(P2, OUTPUT);         
   pinMode(P3, OUTPUT); 
   pinMode(P4, OUTPUT); 
   pinMode(P5, OUTPUT); 
   pinMode(P6, OUTPUT); 

   displayColor(0, 0, 10);
   pompes(0,0,0,0,0,0);
  
  
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(100);
  //lecture de l'état du bouton et stockage dans etatBouton
  boolean etatBt_Standby = digitalRead(pinBt_StandBy);
  boolean etatBt_Flush = digitalRead(pinBt_Flush);
  boolean etatBt_Analyse = digitalRead(pinBt_Analyse);
  
  if (etatBt_Standby==HIGH){
    pompes(0,0,0,0,0,0);
    Serial.println("STOP");
  }
  
  if (etatBt_Flush==HIGH){
    pompes(0,0,0,0,1,0);
    delay(20000);
    pompes(0,0,0,0,0,0);
  }

  if (etatBt_Analyse==HIGH) {
    pompes(0,0,0,0,0,0);
    Serial.println("STOP");
    delay(2000);
    ecran("--> Purge");
    displayColor(0, 10, 0);
    pompes(0,0,0,0,1,0);
    delay(30000); //vidange cone
    pompes(0,1,1,0,1,0); // P2,P3,P5 purge éch
    delay(40000); 
    pompes(0,0,0,1,1,0); // purge marqueur
    delay(40000);
    pompes(0,0,0,0,1,0); 
    delay(16000);
    pompes(1,0,0,0,0,0); //Purge tampon
    delay(24000);
    pompes(0,0,0,0,0,1); //Purge pompe mix
    delay(13000);
    pompes(0,0,0,0,1,0);  
    delay(21000);
    pompes(0,0,0,0,0,0);  
    ecran("Ready");
    displayColor(10, 0, 0);
  }
  
}

void serialEvent() {
   LectureSerie(); //Lecture données sur port série
  
   //Commande des pompes
  if(ComType == "POMPES"){
    pompes(Com1,Com2,Com3,Com4,Com5,Com6);
  }

  if(ComType == "LED"){
    displayColor(Com1,Com2,Com3);
  }

  if(Com1 == 9){
    ecran(ComType);
  }
  if(ComType == "TEST"){
    Serial.println("retourok");
  }
  else {
    Serial.println(ComType);
  }
  ComType = "";
  Com1 = 0;
  Num = 0;
}

Merci par avance :slight_smile:

Essaye de lire le contenu du buffet avec readStringUntil et le terminateur \n

Exemple

if (Serial.available() > 0)
    {
        int Com1 = Serial.readStringUntil(',' ).toInt();
        int Com2 = Serial.readStringUntil(',' ).toInt();
        int Com3 = Serial.readStringUntil(',' ).toInt();
        int Com4 = Serial.readStringUntil(',' ).toInt();
        int Com5 = Serial.readStringUntil(',' ).toInt();
        int Com6 = Serial.readStringUntil('\n' ).toInt();
   }