Problème de comparaison de String

Bonjour à tous ^^

Je tombe sur un problème de comparaison de String tout con mais je n'arrive pas à le résoudre.

Je déclare les variables suivantes:

String FoobarRead = "";
String FoobarSend = "";
String FoobarEtat = "";
char fileName[] = "Foobar_Now_Playing.txt";

Je lis un fichier .txt par FTP et ensuite j'extrait les données

// Lire le fichier
FoobarRead = "";
ftp.InitFile("Type A");
ftp.DownloadString(fileName, FoobarRead);
//Extraction des variables
FoobarSend = FoobarRead;
// Extraction de FoobarRead "FoobarEtat<artiste<album<titre<bitrate<codec<duree<"
int startPos = 0;
int endPos = FoobarSend.indexOf("<");

FoobarEtat = FoobarSend.substring(startPos, endPos);    //playing, paused, stoped
startPos = endPos + 1;
endPos = FoobarSend.indexOf("<", startPos);

Ensuite je dois entrer dans une des trois boucles mais je n'y arrive pas:

if (FoobarEtat == "playing"){
if (FoobarEtat == "paused"){
if (FoobarEtat == "stoped"){

J'ai essayé de convertir FoobarRead en int pour pouvoir comparer deux int mais je n'y arrive pas. J'ai essayé avec .toInt(), strtoul() mais rien.
Je peux vous mettre le code complet si vous voulez.

Merci et bon après midi ^^

Drôle d'idée puisque FoobarRead contient du texte et pas une valeur numérique.

Ta question n'est pas claire tu montres un bout de code où tu essaies de comparer une String et ensuite tu parles de comparer des int.

As-tu fait un Serial.print() de FoobarRead et FoobarEtat pour voir pourquoi l'égalité ne semble pas trouvée?

Salut,

En effet le premier argument devait être du texte (playing, paused ou stoped) que j'ai remplacé par 1, 2 et 3 pour ensuite convertir en int.

J'ai fait un Serial.print() des valeurs qui sont bonnes mais pourtant.

Voici le code:

//ESP32S
//Programme pour se connecter au WiFi et au FTP pour lire les tags de Foobar dans un fichier .txt
//et les afficher sur un bandeau LED

#include <WiFi.h>
#include <ESP32_FTPClient.h>
#include <SoftwareSerial.h>

//WiFi Livebox
#define WIFI_SSID "XXXX"
#define WIFI_PASS "XXXX"

SoftwareSerial SerialHaut(16, 17);
SoftwareSerial SerialBas(18, 19);

//FTP MakomotoryP
char ftp_server[] = "192.168.1.17";
char ftp_user[] = "Arduino";
char ftp_pass[] = "Arduino";
char fileName[] = "Foobar_Now_Playing.txt";
ESP32_FTPClient ftp (ftp_server, 21, ftp_user, ftp_pass, 1000);

unsigned long TempoReadFtp;
int WifiEtat, FtpEtat, NewMessage = 0;
// int playing = 1;
// int paused = 2;
// int stoped = 3;
// int intValue = 5;


String FoobarRead = "";
String FoobarSend = "";
String FoobarEtat = "";
String Artiste = "";
String Album = "";
String Titre = "";
String Bitrate = "";
String Codec = "";
String Duree = "";
String TextHaut = "";
String TextBas = "";
String data = "";


void setup() {
  TempoReadFtp = millis();

  Serial.begin(115200);
  SerialHaut.begin(115200);
  SerialBas.begin(115200);

  //Initialisation du WiFi
  //L'ESP32S s'occupe de la reconnection automatique
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  Serial.print("SETUP état Wifi: ");   Serial.println(WiFi.status());   // Phase test

  ftp.OpenConnection();
  Serial.print("SETUP état FTP: ");   Serial.println(ftp.isConnected());   // Phase test

  Serial.println("Fin de boucle SETUP");   // Phase test
}


void loop() {
 // Si WiFi déconnecté
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Début boucle Wifi déconnecté: ");   Serial.println(WiFi.status());   // Phase test
    WifiEtat = 0;
    WiFi.begin(WIFI_SSID, WIFI_PASS);

    Serial.print("Wifi status suite à déconnection: ");   Serial.println(WiFi.status());   // Phase test
  }

  while (WiFi.status() == WL_CONNECTED) {
    WifiEtat = 1;

    if (ftp.isConnected()==1){
      FtpEtat = 1;

      if((millis()-TempoReadFtp)>=300){

        // Lire le fichier
        FoobarRead = "";
        ftp.InitFile("Type A");
        ftp.DownloadString(fileName, FoobarRead);
        TempoReadFtp = millis();
      }
    }
    else {
      Serial.print("Déconnection FTP. FtpEtat: ");    Serial.println(FtpEtat);   // Phase test
      FtpEtat = 0;
      ftp.OpenConnection();
      Serial.print("FTP status suite à déconnection: ");    Serial.println(ftp.isConnected());   // Phase test
    }

    if (FoobarRead != FoobarSend){
      NewMessage = 1;

      Serial.print("FoobarSend: ");       Serial.println(FoobarSend);   // PHASE TEST

      FoobarSend = FoobarRead;

      Serial.print("FoobarSend: ");       Serial.println(FoobarSend);   // PHASE TEST

      // Extraction de FoobarRead "FoobarEtat<artiste<album<titre<bitrate<codec<duree<"
      int startPos = 0;
      int endPos = FoobarSend.indexOf("<");

      FoobarEtat = FoobarSend.substring(startPos, endPos);    //playing, paused, stoped
      //FoobarEtat = (FoobarSend.substring(startPos, endPos)).trim();
      //FoobarEtat = cleanString(FoobarSend.substring(startPos, endPos));
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Artiste = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Album = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Titre = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Bitrate = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Codec = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Duree = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Serial.print("FoobarEtat: ");    Serial.println(FoobarEtat);   // PHASE TEST
      Serial.print("Artiste: ");       Serial.println(Artiste);   // PHASE TEST
      Serial.print("Album: ");         Serial.println(Album);   // PHASE TEST
      Serial.print("Titre: ");         Serial.println(Titre);   // PHASE TEST
      Serial.print("Bitrate: ");       Serial.println(Bitrate);   // PHASE TEST
      Serial.print("Codec: ");         Serial.println(Codec);   // PHASE TEST
      Serial.print("Duree: ");         Serial.println(Duree);   // PHASE TEST
      Serial.println();   // PHASE TEST
    }

    ///////////////////////////////////////////////////////////////////////
    // Gabarit bandeau Haut: "WifiEtat<FtpEtat<Mode<Artist<Album<Titre"  //
    // Gabarit bandeau Bas: "WifiEtat<FtpEtat<Mode<Artiste<Album<"       //
    // -Mode1: playing                                                   //
    // -Mode2: paused                                                    //
    // -Mode3: stoped                                                    //
    ///////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////
    //                       Code Foobar                         //
    ///////////////////////////////////////////////////////////////
    // $if(%isplaying%,                                          //
    // $if(%ispaused%,                                           //
    // paused<                                                   //
    // ,                                                         //
    // playing<                                                  //
    //  )                                                        //
    //  %artist%<%album%<%title%<%bitrate%<%codec%<%length%<,    //
    // stopped                                                   //
    // )                                                         //
    ///////////////////////////////////////////////////////////////

    // Envois Tags vers SerialHaut et SerialBas
    if (NewMessage == 1){
      Serial.println("Début boucle envoi vers les afficheurs");   // PHASE TEST
      Serial.print("FoobarEtat: ");    Serial.println(FoobarEtat);   // PHASE TEST

      //String stringValue = "1234";
      //int temp = (int)(FoobarEtat.toInt());
  
      //int temp2 = strtoul(FoobarEtat, NULL, 10);
      //Serial.print("Using strtoul = ");
      //Serial.println(temp2);
      //Serial.println(String(temp2));

      //Serial.print("FoobarEtat.toInt: ");      Serial.println(FoobarEtat.toInt());
      //intValue = FoobarEtat.toInt();
      //Serial.print("intValue: ");      Serial.println(intValue);

      //if (FoobarEtat == 1){
      if (FoobarEtat == "playing"){
      //if (temp2 == 1){
        //if (FoobarEtat.equals("playing")) {
        //if (strcmp(FoobarEtat, "playing") == 0) {     //Code à essayer si la comparaison ne fonctionne pas
        Serial.println("Entrée boucle Playing");   // PHASE TEST
        // Envoyer  Artiste et Album sur le bandeau Haut
        // Envoyer Titre sur le bandeau Bas

        if (SerialHaut.available()){
          Serial.println("Début envoi afficheur Haut Playing");   // PHASE TEST
          SerialHaut.print(WifiEtat);
          SerialHaut.print("<");
          SerialHaut.print(FtpEtat);
          SerialHaut.print("<");
          SerialHaut.print("1");
          SerialHaut.print("<");
          SerialHaut.print(Artiste);
          SerialHaut.print("<");
          SerialHaut.print(Album);
          SerialHaut.print("<");
          SerialHaut.print(Titre);
          SerialHaut.print("<");
          SerialHaut.print("#");      //Marqueur de fin
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Haut Playing");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialHaut Playing indisponible");   // PHASE TEST
        }

        if (SerialBas.available()){
          Serial.println("Début envoi afficheur Bas Playing");   // PHASE TEST
          SerialBas.print(WifiEtat);
          SerialBas.print("<");
          SerialBas.print(FtpEtat);
          SerialBas.print("<");
          SerialBas.print("1");
          SerialBas.print("<");
          SerialBas.print(Artiste );
          SerialBas.print("<");
          SerialBas.print(Album );
          SerialBas.print("<");
          SerialBas.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Bas Playing");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialBas Playing indisponible");   // PHASE TEST
        }

        //NewMessage = 0;
        Serial.print("NewMessage: ");    Serial.println(NewMessage);   // PHASE TEST
        Serial.println("Fin de boucle Playing: ");   // PHASE TEST
      }

      //if (FoobarEtat == 2){
      //if (intValue == paused){
      if (FoobarEtat == "paused"){
        Serial.println("Entrée boucle Paused");   // PHASE TEST
        // Envoyer Titre sur le bandeau Haut
        // Envoyer Pause sur le bandeau Bas

        if (SerialHaut.available()){
          Serial.println("Début envoi afficheur Haut Paused");   // PHASE TEST
          SerialHaut.print(WifiEtat);
          SerialHaut.print("<");
          SerialHaut.print(FtpEtat);
          SerialHaut.print("<");
          SerialHaut.print("2");
          SerialHaut.print("<");
          SerialHaut.print(Titre);
          SerialHaut.print("<");
          SerialHaut.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Haut Paused");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialHaut Paused indisponible");   // PHASE TEST
        }

        if (SerialBas.available()){
          Serial.println("Début envoi afficheur Bas Paused");   // PHASE TEST
          SerialBas.print(WifiEtat);
          SerialBas.print("<");
          SerialBas.print(FtpEtat);
          SerialBas.print("<");
          SerialBas.print("2");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Bas Paused");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialBas Paused indisponible");   // PHASE TEST
        }

        //NewMessage = 0;
        Serial.print("NewMessage: ");    Serial.println(NewMessage);   // PHASE TEST
        Serial.println("Fin de boucle Paused: ");   // PHASE TEST
      }

      //if (FoobarEtat == 3){
      //if (intValue == stoped){
      if (FoobarEtat == "stoped"){
        Serial.println("Entrée boucle Stoped");   // PHASE TEST
        // Effacer le bandeau Haut
        // Envoyer "Stop" au milieu du bandeau Bas

        if (SerialHaut.available()){
          Serial.println("Début envoi afficheur Haut Stoped");   // PHASE TEST
          SerialHaut.print(WifiEtat);
          SerialHaut.print("<");
          SerialHaut.print(FtpEtat);
          SerialHaut.print("<");
          SerialHaut.print("3");
          SerialHaut.print("<");
          SerialHaut.print("<");
          SerialHaut.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Haut Stoped");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialHaut Stoped indisponible");   // PHASE TEST
        }

        if (SerialBas.available()){
          Serial.println("Début envoi afficheur Bas Stoped");   // PHASE TEST
          SerialBas.print(WifiEtat);
          SerialBas.print("<");
          SerialBas.print(FtpEtat);
          SerialBas.print("<");
          SerialBas.print("3");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Bas Stoped");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialBas Stoped indisponible");   // PHASE TEST
        }

        //NewMessage = 0;
        Serial.print("NewMessage: ");    Serial.println(NewMessage);   // PHASE TEST
        Serial.println("Fin de boucle Stoped: ");   // PHASE TEST
      }  //if Serial
    }
  }  //While
}  //Loop

surement mais il faut te croire sur parole :frowning:
Que veux tu dire par pourtant ? tu t'attends à quoi et que ce passe t-il?

Si tu donnait la sortie du moniteur série et ce que tu t'attends comme comportement et pourquoi, cela serait plus simple pour nous de t'aider

Je récupere bien FoobarRead qui a cette forme: "FoobarEtat<artiste<album<titre<bitrate<codec<duree<"

Apres extraction FoobarEtat prend bien une des trois valeurs suivante "playing", "paused" ou "stoped"

Le probleme est ici: Je n'arrive pas à attaquer les boucles "if (FoobarEtat == "playing"){" ou "if (FoobarEtat == "paused"){" ou "if (FoobarEtat == "stoped"){"
Quand je fais Serial.println(FoobarEtat) j'obtiens bien une de ces trois valeurs "playing", "paused" ou "stoped" en fonction de l'état de lecture de Foobar2000.
Pourquoi je n'entre pas dans la boucle alors que les conditions sont réunies?

Je n'ai pas ce qu'il faut avec moi. Ce soir en rentant je ferai une copie du moniteur série pour vous montrer ^^

faites un print comme cela

  Serial.print("FoobarEtat: [");    Serial.print(FoobarEtat); Serial.print("]\t"); Serial.println(FoobarEtat.length());
  Serial.print("Artiste: [");       Serial.print(Artiste);    Serial.print("]\t"); Serial.println(Artiste.length());
  Serial.print("Album: [");         Serial.print(Album);      Serial.print("]\t"); Serial.println(Album.length());
  Serial.print("Titre: [");         Serial.print(Titre);      Serial.print("]\t"); Serial.println(Titre.length());
  Serial.print("Bitrate: [");       Serial.print(Bitrate);    Serial.print("]\t"); Serial.println(Bitrate.length());
  Serial.print("Codec: [");         Serial.print(Codec);      Serial.print("]\t"); Serial.println(Codec.length());
  Serial.print("Duree: [");         Serial.print(Duree);      Serial.print("]\t"); Serial.println(Duree.length());

assurez vous qu'il n'y a aucun autre caractère entre les crochets que ceux que vous voulez et vérifier le compte du nombre de caractères

1 Like

Ok, un bonne pratique pour debugger est de mettre ce que l'on affichage entre des caractères d'encadrement, au cas ou il y est un espace ou un caractère non affichable.

Oups devancer par @J-M-L

1 Like

Bonjour mimikrakra

Une idée pour résoudre ton problème, splitter les données reçues (FoobarSend).
Ca se fait au moyen de la bibliothèque StringAction.

Dans mon exemple, chaque élément de la réception se retrouve séparé dans le tableaufoobarSplitted[fooChpNombre]
et les champs sont numérotés dans:
enum {fooChpEtat, fooChpArtiste, fooChpAlbum, fooChpTitre, fooChpBitrate, fooChpCodec, fooChpDuree, fooChpNombre}; // Liste des champs

Ainsi, pour afficher l'état:
Serial.println(foobarSplitted[fooChpEtat]);
ou l'artiste:
Serial.println(foobarSplitted[fooChpArtiste]);

Pour trigger sur l'état:
if (foobarSplitted[fooChpEtat] == "playing")

Pour essayer, tu peux introduire FoobarSend dans la ligne de commande du moniteur, avec
image
.
un exemple:
playing<Johnny<Johnny, reviens !<Le Penitencier<1411<245<

Le programme:

/*
    Name:       AF_mimikrakra_Foobar.ino
    Created:	27.01.2025
    Author:     jpbbricole
	Remarque:	Extraction de données
				https://forum.arduino.cc/t/probleme-de-comparaison-de-string/1347550
				FoobarEtat<artiste<album<titre<bitrate<codec<duree<
				playing<Johnny<Johnny, reviens !<Le Penitencier<1411<245<
*/
#include <StringAction.h>

//------------------------------------- Tableau des données
StringAction toolSplit; // Création du splitter

enum {fooChpEtat, fooChpArtiste, fooChpAlbum, fooChpTitre, fooChpBitrate, fooChpCodec, fooChpDuree, fooChpNombre}; // Liste des champs
String foobarSplitted[fooChpNombre];
String FoobarSend; // Données reçues

void setup()
{
	Serial.begin(115200);
}

void loop()
{
	if (Serial.available())
	{
		FoobarSend = Serial.readStringUntil('\n'); // Lire serial jusqu'à nouvelle ligne
		FoobarSend.trim(); // Nettoyage de la réception
		foobarSplit(FoobarSend); // Mise en tableau de la réception
		Serial.println("Recu: " + FoobarSend);

		if (foobarSplitted[fooChpEtat] == "playing")
		{
			Serial.println("\tAction pour playing");
		} 
		else if (foobarSplitted[fooChpEtat] == "paused")
		{
			Serial.println("\tAction pour  paused");
		}
		else if (foobarSplitted[fooChpEtat] == "stoped")
		{
			Serial.println("\tAction pour  stopped");
		}
		else
		{
			Serial.println("Etat inconnu: " + foobarSplitted[fooChpEtat]);
		}
	}

}

//  // Mise en tableau de données reçues retour danbs tableau foobarSplitted
void foobarSplit(String data) // Mise en tableau de données reçues
{
	toolSplit.split(FoobarSend, foobarSplitted, "<");
}

A ta disposition pour toutes questions :wink:

Cordialement
jpbbricole

1 Like

Merci à tous ^^

J'ai modifié mon code comme ceci

//ESP32S
//Programme pour se connecter au WiFi et au FTP pour lire les tags de Foobar dans un fichier .txt
//et les afficher sur un bandeau LED

#include <WiFi.h>
#include <ESP32_FTPClient.h>
#include <SoftwareSerial.h>

//WiFi Livebox
#define WIFI_SSID "XXXXXX"
#define WIFI_PASS "XXXXXX"

SoftwareSerial SerialHaut(16, 17);
SoftwareSerial SerialBas(18, 19);

//FTP MakomotoryP
char ftp_server[] = "192.168.1.17";
char ftp_user[] = "Arduino";
char ftp_pass[] = "Arduino";
char fileName[] = "Foobar_Now_Playing.txt";
ESP32_FTPClient ftp (ftp_server, 21, ftp_user, ftp_pass, 1000);

unsigned long TempoReadFtp;
int WifiEtat, FtpEtat, NewMessage = 0;
// int playing = 1;
// int paused = 2;
// int stoped = 3;
// int intValue = 5;


String FoobarRead = "";
String FoobarSend = "";
String FoobarEtat = "";
String Artiste = "";
String Album = "";
String Titre = "";
String Bitrate = "";
String Codec = "";
String Duree = "";
String TextHaut = "";
String TextBas = "";
String data = "";


void setup() {
  TempoReadFtp = millis();

  Serial.begin(115200);
  SerialHaut.begin(115200);
  SerialBas.begin(115200);

  //Initialisation du WiFi
  //L'ESP32S s'occupe de la reconnection automatique
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  Serial.print("SETUP état Wifi: ");   Serial.println(WiFi.status());   // Phase test

  ftp.OpenConnection();
  Serial.print("SETUP état FTP: ");   Serial.println(ftp.isConnected());   // Phase test

  Serial.println("Fin de boucle SETUP");   // Phase test
}


void loop() {
 // Si WiFi déconnecté
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Début boucle Wifi déconnecté: ");   Serial.println(WiFi.status());   // Phase test
    WifiEtat = 0;
    WiFi.begin(WIFI_SSID, WIFI_PASS);

    Serial.print("Wifi status suite à déconnection: ");   Serial.println(WiFi.status());   // Phase test
  }

  while (WiFi.status() == WL_CONNECTED) {
    WifiEtat = 1;

    if (ftp.isConnected()==1){
      FtpEtat = 1;

      if((millis()-TempoReadFtp)>=300){

        // Lire le fichier
        FoobarRead = "";
        ftp.InitFile("Type A");
        ftp.DownloadString(fileName, FoobarRead);
        TempoReadFtp = millis();
      }
    }
    else {
      Serial.print("Déconnection FTP. FtpEtat: ");    Serial.println(FtpEtat);   // Phase test
      FtpEtat = 0;
      ftp.OpenConnection();
      Serial.print("FTP status suite à déconnection: ");    Serial.println(ftp.isConnected());   // Phase test
    }

    if (FoobarRead != FoobarSend){
      NewMessage = 1;

      Serial.print("FoobarSend avant copie Read -> Send: [");       Serial.print(FoobarSend);    Serial.print("]\t");     Serial.println(FoobarSend.length());   // PHASE TEST
      FoobarSend = FoobarRead;

      Serial.print("FoobarSend apres copie Read -> Send: [");       Serial.print(FoobarSend);    Serial.print("]\t");     Serial.println(FoobarSend.length());   // PHASE TEST

      // Extraction de FoobarRead "FoobarEtat<artiste<album<titre<bitrate<codec<duree<"
      int startPos = 0;
      int endPos = FoobarSend.indexOf("<");

      FoobarEtat = FoobarSend.substring(startPos, endPos);    //playing, paused, stoped
      //FoobarEtat = (FoobarSend.substring(startPos, endPos)).trim();
      //FoobarEtat = cleanString(FoobarSend.substring(startPos, endPos));
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Artiste = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Album = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Titre = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Bitrate = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Codec = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      Duree = FoobarSend.substring(startPos, endPos);
      startPos = endPos + 1;
      endPos = FoobarSend.indexOf("<", startPos);

      // Serial.print("FoobarEtat: ");    Serial.println(FoobarEtat);   // PHASE TEST
      // Serial.print("Artiste: ");       Serial.println(Artiste);   // PHASE TEST
      // Serial.print("Album: ");         Serial.println(Album);   // PHASE TEST
      // Serial.print("Titre: ");         Serial.println(Titre);   // PHASE TEST
      // Serial.print("Bitrate: ");       Serial.println(Bitrate);   // PHASE TEST
      // Serial.print("Codec: ");         Serial.println(Codec);   // PHASE TEST
      // Serial.print("Duree: ");         Serial.println(Duree);   // PHASE TEST
      // Serial.println();   // PHASE TEST

      Serial.print("FoobarEtat: [");    Serial.print(FoobarEtat); Serial.print("]\t"); Serial.println(FoobarEtat.length());   // PHASE TEST
      Serial.print("Artiste: [");       Serial.print(Artiste);    Serial.print("]\t"); Serial.println(Artiste.length());   // PHASE TEST
      Serial.print("Album: [");         Serial.print(Album);      Serial.print("]\t"); Serial.println(Album.length());   // PHASE TEST
      Serial.print("Titre: [");         Serial.print(Titre);      Serial.print("]\t"); Serial.println(Titre.length());   // PHASE TEST
      Serial.print("Bitrate: [");       Serial.print(Bitrate);    Serial.print("]\t"); Serial.println(Bitrate.length());   // PHASE TEST
      Serial.print("Codec: [");         Serial.print(Codec);      Serial.print("]\t"); Serial.println(Codec.length());   // PHASE TEST
      Serial.print("Duree: [");         Serial.print(Duree);      Serial.print("]\t"); Serial.println(Duree.length());   // PHASE TEST
      Serial.println();   // PHASE TEST
    }

    ///////////////////////////////////////////////////////////////////////
    // Gabarit bandeau Haut: "WifiEtat<FtpEtat<Mode<Artist<Album<Titre"  //
    // Gabarit bandeau Bas: "WifiEtat<FtpEtat<Mode<Artiste<Album<"       //
    // -Mode1: playing                                                   //
    // -Mode2: paused                                                    //
    // -Mode3: stoped                                                    //
    ///////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////
    //                       Macro Foobar2000                    //
    ///////////////////////////////////////////////////////////////
    // $if(%isplaying%,                                          //
    // $if(%ispaused%,                                           //
    // paused<                                                   //
    // ,                                                         //
    // playing<                                                  //
    //  )                                                        //
    //  %artist%<%album%<%title%<%bitrate%<%codec%<%length%<,    //
    // stopped                                                   //
    // )                                                         //
    ///////////////////////////////////////////////////////////////

    // Envois Tags vers SerialHaut et SerialBas
    if (NewMessage == 1){
      Serial.println("Début boucle envoi vers les afficheurs");   // PHASE TEST
      Serial.print("FoobarEtat: [");    Serial.print(FoobarEtat); Serial.print("]\t"); Serial.println(FoobarEtat.length());   // PHASE TEST

      //String stringValue = "1234";
      //int temp = (int)(FoobarEtat.toInt());
  
      //int temp2 = strtoul(FoobarEtat, NULL, 10);
      //Serial.print("Using strtoul = ");
      //Serial.println(temp2);
      //Serial.println(String(temp2));

      //Serial.print("FoobarEtat.toInt: ");      Serial.println(FoobarEtat.toInt());
      //intValue = FoobarEtat.toInt();
      //Serial.print("intValue: ");      Serial.println(intValue);

      //if (FoobarEtat == 1){
      if (FoobarEtat == "playing"){
      //if (temp2 == 1){
        //if (FoobarEtat.equals("playing")) {
        //if (strcmp(FoobarEtat, "playing") == 0) {     //Code à essayer si la comparaison ne fonctionne pas
        Serial.println("Entrée boucle Playing");   // PHASE TEST
        // Envoyer  Artiste et Album sur le bandeau Haut
        // Envoyer Titre sur le bandeau Bas

        // Test formatage d'envoi des tags
        Serial.println("Formatage d'envoi à afficheur Haut Playing");   // PHASE TEST
        Serial.print(WifiEtat);
        Serial.print("<");
        Serial.print(FtpEtat);
        Serial.print("<");
        Serial.print("1");
        Serial.print("<");
        Serial.print(Artiste);
        Serial.print("<");
        Serial.print(Album);
        Serial.print("<");
        Serial.print(Titre);
        Serial.print("<");
        Serial.print("#");      //Marqueur de fin


        if (SerialHaut.available()){
          Serial.println("Début envoi afficheur Haut Playing");   // PHASE TEST
          SerialHaut.print(WifiEtat);
          SerialHaut.print("<");
          SerialHaut.print(FtpEtat);
          SerialHaut.print("<");
          SerialHaut.print("1");
          SerialHaut.print("<");
          SerialHaut.print(Artiste);
          SerialHaut.print("<");
          SerialHaut.print(Album);
          SerialHaut.print("<");
          SerialHaut.print(Titre);
          SerialHaut.print("<");
          SerialHaut.print("#");      //Marqueur de fin
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Haut Playing");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialHaut Playing indisponible");   // PHASE TEST
        }

        if (SerialBas.available()){
          Serial.println("Début envoi afficheur Bas Playing");   // PHASE TEST
          SerialBas.print(WifiEtat);
          SerialBas.print("<");
          SerialBas.print(FtpEtat);
          SerialBas.print("<");
          SerialBas.print("1");
          SerialBas.print("<");
          SerialBas.print(Artiste );
          SerialBas.print("<");
          SerialBas.print(Album );
          SerialBas.print("<");
          SerialBas.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Bas Playing");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialBas Playing indisponible");   // PHASE TEST
        }

        //NewMessage = 0;
        Serial.print("NewMessage: ");    Serial.println(NewMessage);   // PHASE TEST
        Serial.println("Fin de boucle Playing: ");   // PHASE TEST
      }

      //if (FoobarEtat == 2){
      //if (intValue == paused){
      if (FoobarEtat == "paused"){
        Serial.println("Entrée boucle Paused");   // PHASE TEST
        // Envoyer Titre sur le bandeau Haut
        // Envoyer Pause sur le bandeau Bas

        if (SerialHaut.available()){
          Serial.println("Début envoi afficheur Haut Paused");   // PHASE TEST
          SerialHaut.print(WifiEtat);
          SerialHaut.print("<");
          SerialHaut.print(FtpEtat);
          SerialHaut.print("<");
          SerialHaut.print("2");
          SerialHaut.print("<");
          SerialHaut.print(Titre);
          SerialHaut.print("<");
          SerialHaut.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Haut Paused");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialHaut Paused indisponible");   // PHASE TEST
        }

        if (SerialBas.available()){
          Serial.println("Début envoi afficheur Bas Paused");   // PHASE TEST
          SerialBas.print(WifiEtat);
          SerialBas.print("<");
          SerialBas.print(FtpEtat);
          SerialBas.print("<");
          SerialBas.print("2");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Bas Paused");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialBas Paused indisponible");   // PHASE TEST
        }

        //NewMessage = 0;
        Serial.print("NewMessage: ");    Serial.println(NewMessage);   // PHASE TEST
        Serial.println("Fin de boucle Paused: ");   // PHASE TEST
      }

      //if (FoobarEtat == 3){
      //if (intValue == stoped){
      if (FoobarEtat == "stoped"){
        Serial.println("Entrée boucle Stoped");   // PHASE TEST
        // Effacer le bandeau Haut
        // Envoyer "Stop" au milieu du bandeau Bas

        if (SerialHaut.available()){
          Serial.println("Début envoi afficheur Haut Stoped");   // PHASE TEST
          SerialHaut.print(WifiEtat);
          SerialHaut.print("<");
          SerialHaut.print(FtpEtat);
          SerialHaut.print("<");
          SerialHaut.print("3");
          SerialHaut.print("<");
          SerialHaut.print("<");
          SerialHaut.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Haut Stoped");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialHaut Stoped indisponible");   // PHASE TEST
        }

        if (SerialBas.available()){
          Serial.println("Début envoi afficheur Bas Stoped");   // PHASE TEST
          SerialBas.print(WifiEtat);
          SerialBas.print("<");
          SerialBas.print(FtpEtat);
          SerialBas.print("<");
          SerialBas.print("3");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("<");
          SerialBas.print("#");
          NewMessage = 0;
          Serial.println("Fin envoi afficheur Bas Stoped");   // PHASE TEST
        }
        else{
          NewMessage = 1;
          Serial.println("SerialBas Stoped indisponible");   // PHASE TEST
        }

        //NewMessage = 0;
        Serial.print("NewMessage: ");    Serial.println(NewMessage);   // PHASE TEST
        Serial.println("Fin de boucle Stoped: ");   // PHASE TEST
      }  //if Serial

      Serial.println("Fin boucle envoi vers les afficheurs");   // PHASE TEST
    }
  }  //While
}  //Loop

Et voici la sortie du port série. J'ai fait dans l'ordre "arret", "play, "pause", "play" et "next"


ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4916
load:0x40078000,len:16436
load:0x40080400,len:4
ho 8 tail 4 room 4
load:0x40080404,len:3524
entry 0x400805b8
SETUP état Wifi: 6
FTP error: Offline
FTP error: Offline
FTP error: Offline
FTP error: Offline
SETUP état FTP: FTP error: Offline
0
Fin de boucle SETUP
FTP error: Offline
Déconnection FTP. FtpEtat: 0
FTP status suite à déconnection: 1
FoobarSend avant copie Read -> Send: []	0
FoobarSend apres copie Read -> Send: [stopped]	10
FoobarEtat: [stopped]	10
Artiste: [stopped]	10
Album: [stopped]	10
Titre: [stopped]	10
Bitrate: [stopped]	10
Codec: [stopped]	10
Duree: [stopped]	10


Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [stopped]	10
Fin boucle envoi vers les afficheurs
FoobarSend avant copie Read -> Send: [stopped]	10
FoobarSend apres copie Read -> Send: [playing<Bjork<Telegram<Headphones<495<FLAC<6:19<]	51
FoobarEtat: [playing]	10
Artiste: [Bjork]	5
Album: [Telegram]	8
Titre: [Headphones]	10
Bitrate: [495]	3
Codec: [FLAC]	4
Duree: [6:19]	4


Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
FoobarSend avant copie Read -> Send: [playing<Bjork<Telegram<Headphones<495<FLAC<6:19<]	51
FoobarSend apres copie Read -> Send: [paused<Bjork<Telegram<Headphones<495<FLAC<6:19<]	50
FoobarEtat: [paused]	9
Artiste: [Bjork]	5
Album: [Telegram]	8
Titre: [Headphones]	10
Bitrate: [495]	3
Codec: [FLAC]	4
Duree: [6:19]	4


Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [paused]	9
Fin boucle envoi vers les afficheurs
FoobarSend avant copie Read -> Send: [paused<Bjork<Telegram<Headphones<495<FLAC<6:19<]	50
FoobarSend apres copie Read -> Send: [playing<Bjork<Telegram<Headphones<495<FLAC<6:19<]	51
FoobarEtat: [playing]	10
Artiste: [Bjork]	5
Album: [Telegram]	8
Titre: [Headphones]	10
Bitrate: [495]	3
Codec: [FLAC]	4
Duree: [6:19]	4


Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
FoobarSend avant copie Read -> Send: [playing<Bjork<Telegram<Headphones<495<FLAC<6:19<]	51
FoobarSend apres copie Read -> Send: [playing<Dead Can Dance<In Concert (CD1)<Amnesia (live)<956<FLAC<6:18<]	72
FoobarEtat: [playing]	10
Artiste: [Dead Can Dance]	14
Album: [In Concert (CD1)]	16
Titre: [Amnesia (live)]	14
Bitrate: [956]	3
Codec: [FLAC]	4
Duree: [6:18]	4


Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs
Début boucle envoi vers les afficheurs
FoobarEtat: [playing]	10
Fin boucle envoi vers les afficheurs

Si le ftp ne fonctionne pas….

Là on est dans le Setup et le FTP n'est pas encore connecté: "FTP status suite à déconnection: 1"

Le Wifi, FTP et réception Foobar200 fonctionnent bien, c'est après que les choses se gâtent

FoobarEtat: [playing] 10

La longueur ne marche pas

Quelle est la différence entre String FoobarRead qui a comme valeur "playing" et "playing" dans ce code "if (FoobarEtat == "playing"){" ?

En fait, il y a toujours cette écart sur la longueur de FoobarEtat. Alors que sur les autres "champs" il n'y a pas cette différence.
Il doit manifestement y avoir des caractères non affichables cachés.
Il faudrait faire afficher le contenu de FoobarEtat.c_str() caractère par caractère en hexa. Pour voir ce qui se cache là.
Tu as la même chose si tu utilises FoobarEtat.trim()?

1 Like

Bonjour ^^
J'ai pris en compte vos remarques et je vais les essayer ce soir.

J'ai remarqué que les seules variables avec une erreur de longueur sont celles envoyées toutes seules dans le script de Foobar2000 (playing, paused et stoped) mais pas les autres (artist, album, title, bitrate, codec et length)

Le code actuelle est celui ci

$if(%isplaying%,
   $if(%ispaused%,
      paused<,
     playing<
    ) 
    %artist%<%album%<%title%<%bitrate%<%codec%<%length%<,
  stoped
  )

Et je vais essayer celui là

$if(%isplaying%,
   playing<%artist%<%album%<%title%<%bitrate%<%codec%<%length%<
)
$if(%ispaused%,
   paused<%artist%<%album%<%title%<%bitrate%<%codec%<%length%<
)
$if(%isstoped%,
   stoped<%artist%<%album%<%title%<%bitrate%<%codec%<%length%<
)

Pour la condition "stoped" je n'utilise que le premier élément de la chaine.

Re...
Avec FoobarRead.trim() et FoobarEtat.trim() ça ne change rien.
Ma modif du code de Foobar2000 non plus mais j'ai trouvé: en fait c'est le premier élément de la chaine qui fou la merde donc j'en ai mis un qui ne me sert pas et j'ai modifié mon code Arduino.

Voici le nouveau code Foobar2000

$if(%isplaying%,
  $if(%ispaused%,
     vide<paused<%artist%<%album%<%title%<%bitrate%<%codec%<%length%<,
     vide<playing<%artist%<%album%<%title%<%bitrate%<%codec%<%length%<
   ),
  vide<stoped<%artist%<%album%<%title%<%bitrate%<%codec%<%length%<
)

Et la modif du code Arduino

int startPos = 0;
int endPos = FoobarSend.indexOf("<");

Vide = FoobarSend.substring(startPos, endPos);
startPos = endPos + 1;
endPos = FoobarSend.indexOf("<", startPos);

FoobarEtat = FoobarSend.substring(startPos, (endPos));    //playing, paused, stoped
startPos = endPos + 1;
endPos = FoobarSend.indexOf("<", startPos);

Artiste = FoobarSend.substring(startPos, endPos);
startPos = endPos + 1;
endPos = FoobarSend.indexOf("<", startPos);

il y a quoi vraiment dans le fichier ? vous pouvez nous en mettre un en PJ ?

Bien sure, le voici

Foobar_Now_Playing.txt (75 Octets)

Ca serait intéressant de voir les octets téléchargés par cela.