Go Down

Topic: Comparaison entre valeur d'un buffer et un string (Read 799 times) previous topic - next topic

arnaudf09

Bonjour,
Je ne parviens pas à comparer la valeur d'un string avec celle d'un buffer, j'utilise le code suivant, pouvez vous y jeter un œil et me dire ou je me trompe...
Merci d'avance


Je récupère mon buffer (qui provient d'une carte lan ENC28J60 avec la librairie UIPEthernet de la manière suivante:


Code: [Select]

              uint8_t* msg = (uint8_t*)malloc(size);
              size = client.read(msg,size);




j'arrive à l'afficher sur le serial de 2 manières:

1ere manière, qui fonctionne:

Code: [Select]


              Serial.write(msg,size);


2eme manière, qui fonctionne aussi:


Code: [Select]

              MsgString = msg;
              Serial.print(MsgString);



le resultat est le meme pour les 2:
ERROR|NOT LOGGED
ERROR|NOT LOGGED

Par contre, je ne parviens pas à faire de if ou d'autre conditions logiques dessus...

La, si j'utilise le code suivant, cela ne fonctionne pas... ???
Code: [Select]


    if (MsgString = String("ERROR|NOT LOGGED"))
      {
        Serial.print("ERROR NOT LOGGED");
        Serial.println(); 
      } // Fin du if (MsgString = String("ERROR|NOT LOGGED"))   

   
    if (MsgString = String("ERROR|BAD PASSWORD"))
      {
        Serial.print("ERROR BAD PASSWORD");
        Serial.println(); 
      } // Fin du if (MsgString = String("ERROR|BAD PASSWORD"))






je n'ai aucun retour sur le moniteur série... ???

Avez vous une idée d'où je peux me planter ???

Merci

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

arnaudf09

Bjr, oui je viens de m'en rendre compte mais à priori ca ne viens pas de ca...
Je traite sur un autre forum, une partie de mon probleme, si tu veux y jeter un oeil, à priori une erreur de
msg est un pointeur sur un buffet que tu as reservé
"ERROR|BAD PASSWORD" ( ou "HELLO", etc) est un pointeur sur une chaine de caractères quelque part dans la mémoire, là où le programme conserve ces chaines constantes.
Donc msg ne peut jamais être égal à "ERROR|BAD PASSWORD" ou à "HELLO" ou etc..
Pour comparer 2 chaines de caractères, il faut utiliser la fonction strcmp()

https://forum.arduino.cc/index.php?topic=535110.new#new


arnaudf09

meme avec strcmp, ca marche pas...

Code: [Select]



// Compare string1 à string2 et retourne 0 si egal
    if (strcmp(msg,"ERROR|NOT LOGGED") == 0)
    {
        Serial.print("ERROR NOT LOGGED");
        Serial.println();
    }


arnaudf09

ca ne fonctionne pas non plus, toujours rien d'affiché sur le moniteur serie

Code: [Select]



// Compare string1 à string2 et retourne 0 si egal
    if (strncmp(msg,"ERROR|NOT LOGGED",size) == 0)
    {
        Serial.print("ERROR NOT LOGGED");
        Serial.println();
    }


arnaudf09

resultat:

18 : E=45 R=52 R=52 O=4F R=52 |=7C N=4E O=4F T=54  =20 L=4C O=4F G=47 G=47 E=45 D=44
=D
=A

arnaudf09

maintenant comment comparer chaque valeur au string recherché ???

lesept

Il y a donc 2 caractères en fin de chaîne : un CR (code D : Carriage Return) et un LF (code A : Line Feed). il faudrait faire le strncmp sur les 16 premier caractères
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

arnaudf09

Bien vu, maintenant cela fonctionne avec le code suivant:

Code: [Select]


// Compare string1 à string2 et retourne 0 si egal
// size - 2 car CRLF donc 2 caractères à la fin du string
    if (strncmp(msg,"ERROR|NOT LOGGED",(size-2)) == 0)
    {
        Serial.print("ERROR NOT LOGGED");
        Serial.println();
    }



Merci pour votre aide...

Une autre question concernant ce fameux CRLF, je dois dans cette meme application envoyer des données du style suivant et je voudrais justement ajouter le CR et le LF à ma commande...



Code: [Select]



          client.println("HELLO|A2S|1234"); // Envoyé la demande de connexion





et je voudrais envoyer le CRLF avec, comment m'y prendre ???

arnaudf09

Merci à tous, ça fonctionne nickel...

Je me heutre à un autre probleme que je decris dans ce topic, pour les PRO, pouvez vous encore m'aider un peut ???

Merci d'avance

https://forum.arduino.cc/index.php?topic=535110.new#new


arnaudf09

Bon, ca marche, je récupère bien mon mot envoyé, le déchiffre bien et communique bien avec le logiciel du fabriquant.

J'ai un autre problème maintenant...

Je récupère une série de valeurs variant de 0 à 1023 en provenance d'un MSEGQ7 qui est un analyseur de spectre pour sortie des valeurs correspondante à des bandes de fréquences spécifiques 63 Hz, 160 Hz, 400 Hz, 1 kHz, 2.5 kHz, 6.25 kHz and 16 kHz. je les récupères sous la forme
Code: [Select]

  SpectrumValue[i] = analogRead(MSEGQ7AnalogPin);


et j'obtiens
Code: [Select]

Valeurs du Spectre: 224 / 264 / 563 / 655 / 419 / 320 / 221 /


Ensuite je récupère la valeur analogique d'une broche de l'Arduino qui est le signal d'entrée pour ensuite le filtrer via un filtre RC ainsi qu'un bit correspondant au Beat de la musique via le code suivant:

Code: [Select]

void DetectBeat()
{
  if (InputValue > NewHigh) {
    NewHigh = InputValue * CoefficientCalculBeat;
    Counter = 0;
    Serial.println("Beat ON");
    digitalWrite(LedPin1, HIGH);
    DetectionBeat = 1;
    }
    else
    {
    Serial.println("Beat Off");
    digitalWrite(LedPin1, LOW);
    DetectionBeat = 0;
  }



Ensuite, j'ai également une broche d'entrée analogique relié à un potentiomètre afin d'ajuster la sensibilité du système.


Je voudrais trouver une formule afin de détecter la variation (fixée par une valeur) de la Bande 1 du MSGEQ7 Correspondante aux basses afin de les détecter.

Cette valeur correspond a la bande 1 du spectre
Valeurs du Spectre: 224 dans l'exemple

l'idée est d'envoyer soit un BEAT à chaque battement déterminé ou d'envoyer une valeur correspondante aux BPM dans le logiciel du fabriquant...


Le problème est que la bande 1 du spectre varie de 0 à 1024 en fonction de l'intensité musicale envoyée au MSGEQ7. Elle devrait être compensée par la valeur filtrée de la broche d'entrée analogique...

Pouvez vous une fois encore m'aider ???

Un grand merci d'avance

arnaudf09

j'ai trouvé mes réponses...
Je continue. Merci à tous sincèrement

Go Up