Récupérer une trame pour l'utiliser

Bonsoir à tous ! Je vous expose mon petit problème.
Je voudrais lire une trame pour y faire appliquer une lecture et donc une action

La valeur j'arrive à la voir sur le moniteur série. Par contre je n'arrive pas à faire une action. Je voudrais pour tester juste que les sortie D0 et D1 s'active quand je reçois une trame ou une autre.

Je vous met à disposition mon code , j'imagine que ça doit être dù au boucle car j'ne ai beaucoup et il se peux que je me sois emmêler les pinceaux.
J'ai aussi essayé avec un Arduino UNO muni d'un Shield Ethernet mais j'ai le même resultat

Je vous remercie d'avance et vous souhaites une excellente soirée !

#include <SPI.h>
#include <Ethernet.h>
#include <Controllino.h>

// Entrer l'adresse MAC , ne pas prendre une qui existe déjà !
// L'adresse IP depend du reseau sur lequel vous êtes connecté.
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xFC, 0x17};
IPAddress ip(192, 168, 23, 154);
// Entrer l'adresse IP du serveur sur lequel vous voulez vous connecter
IPAddress server(192, 168, 23,153);

// Initilialisation de la librairie Ethernet
// Initialisation de l'adresse IP et du Serveur
// Pour ce connecté sur un serveur (port 23 est par default pour un telnet;
EthernetClient client;

void setup() {
   pinMode (CONTROLLINO_D0, OUTPUT);
  pinMode (CONTROLLINO_D1, OUTPUT);
  // Commencement de la connexion Ethernet
  Ethernet.begin(mac, ip);
  // Ouverture du Serial de communication 
  Serial.begin(9600);
  while (!Serial) {
    ; // On attend que le Serial ce connecte.
  }


  // Initialisation du Shield Ethernet
  delay(1000);
  Serial.println("connexion...");

  // Si il y a une connection on l'ecrit sur le moniteur serial
  if (client.connect(server, 2111)) {
    Serial.println("connecté");
  } else {
    // Si il n'y en a pas on l'écrit aussi
    Serial.println("connexion echoué");
  }
}

void loop() 
{
  // On verifie si le client est bien présent
  if (client.available()) 
  {
    char c = client.read();
    Serial.print(c);
  }

  // Si il y a connection on l'indique
  while (Serial.available() > 0) 
  {  // si c'est >0 c'ets qu'il y a quelqu'un
    int trame = Serial.read(); // une variable trame va lire ce qu'il y a d'envoyé sur le serveur
    while(client.connected()) // si le client est connecté
    { 
      client.print(trame); // alors on écrit ce qu'il y a sur la variable Trame
      if (trame = 6047078288){ // si la trame est égale à ça 
          digitalWrite (CONTROLLINO_D0, HIGH); // alors on déclenche D0
         }
         
      if (trame = X); // Si la trame est égale à ca 
          {
            digitalWrite (CONTROLLINO_D1, HIGH); // alors on déclenche D1
          }
    }
  }



  
  // Une fois que le serveur est arrété on l'indique
  if (!client.connected()) {
    Serial.println();
    Serial.println("deconnexion.");
    client.stop();
    while (true);
  }
}

Ça peut pas le faire:

    int trame = Serial.read(); // une variable trame va lire ce qu'il y a d'envoyé sur le serveur
   .......

      if (trame = 6047078288){ // si la trame est égale à ça

Un int ne peut contenir qu'une valeur codée sur 16 bits (donc valeur max=65535).
Ta manière de gérer la trame n'est pas bonne. Il faudrait soit la gérer sous forme d'une chaîne de caractères soit la traiter en numérique digit par digit.

Bonjour à vous deux et merci de m'avoir accordé quelques réponses.

Alors oui erreur d’inattention concernant le int : j'ai complètement oublié de rajouter un long. Maintenant c'est fait.

Pour le double "==" j'ai eu un doute dessus , et merci de m'avoir donné la réponse maintenant c'est corrigé.

Pour ce qui est du ";" à la fin de "if" c'est une erreur de copie de ma part qui n'apparais pas dans mon code.

J'ai testé , mais les leds D0 et D1 ne s'allument toujours pas. J'ai bien la trame qui est écrit sur le moniteur série : 6047078288 mais après pas d'action.

Je vais continuer à chercher la cause du problème. Merci pour ces quelques corrections !

@fdufnews donc que je mette ma chaîne de caractère entre '' ? Caractère par caractère ou la chaine fonctionne aussi ?

Je vais faire quelques test et vous tiens au courant. Peut être en ajoutant un tableau

Un long n'est pas assez grand pour contenir la valeur.

Donc en fait, si j'ai bien compris. La valeur que je récupère et que je vois apparaître, je ne peux pas l'utilisé directement.

Je vais donc essayé d'écrire quelques choses pour pouvoir interagir avec.

Merci de vos conseils , je posterais pour prévenir si j'ai de nouvelle infos.

Désolé du double post.

Bon je n'ai toujours pas trouver de solution pour effectuer une action avec la valeur que je récupère sur le serveur.

Je vais essayer autres choses. Si vous avez une idée de la manière de s'y prendre n’hésitez pas.

ce qu'essaient de te dire les autres c'est qu'il faut utiliser un "long long int" pour ta variable (et pas un "long int") ainsi que pour lire ta valeur il faut la lire autrement qu'en faisant un simple Serial.read(). Au vu de sa grande taille il faut que tu lises & concatènes (binairement ou "textuellement", selon le format) plusieurs fois avant d'avoir ta valeur complète...

Ce qu'il faudrait déjà connaitre, il me semble, c'est sous quelle forme est transmise la donnée à traiter:

  • une suite d'octets pour recomposer le mot de 10 digit
  • une chaînee de caractères
    Cela change un peu la manière de coder la réception.

@Zorro_X Oui ça j'ai modifié , le truc c'est que sur le moniteur je reçois la trame. Donc en fait je l'a reçois mais je ne fais que la lire, je ne peux pas l'utiliser ?

@fdufnews Alors de base je reçois une suite de caractère par exemple ceci :
"X" mais ce qui m’intéresse c'est seulement les 10 caractères qui sont au centre , donc je peux faire apparaître seulement ceux qui m’intéresse avec le lecteur et donc je reçois avec le moniteur série la suite qui est sur l'image du dessus.

J'ai oublié de préciser que ma valeur est lu a l'aide du " client.read()"

eh bien la solution tu l'as presque dit toi même : "10 caractères" !
ce qu'il te faut c'est donc lire ta trame série et l'utiliser comme une chaîne de caractères (la classe String peut bien faire l'affaire dans ce cas) ensuite au lieu de la comparer à un long long int, tu la compares à une autre chaîne de caractères qui contient ta trame de référence (suite de chiffres codés en tant que caractères ASCII), et tu pourras retrouver ta trame sans te soucier de la taille de ton entier...
utiliser un long long int est utile si t'as besoin de faire des calculs dessus, mais comme tu ne fais que comparer pour savoir si c'est la valeur que t'attends, utiliser une chaîne de caractères est largement suffisant.

D'accord je vais voir tous ça. Je vous tiens au courant pour mon avancé. Merci

Me revoilà. Désolé du temps j'ai mis pas mal de temps à essayé plusieurs solution sans vraiment de résultat.
Aujourd'hui j'ai un résultat plutôt pas mal , je vous remercie de m'avoir mis sur la voie, ça m'a permis de voir où étais mon erreur !

Maintenant je pense à la suite parce que là je fais une comparaison avec une trame que j'ai mis physiquement dans le programme. Mais si c'est un autre au lieu de toujours devoir entrer dans le programme et changer la valeur de la trame j'ai penser aujourd'hui à autre chose et j'aimerais votre avis.

Si je au lieu d'avoir une trame physique je fait en sorte que : Je lis la valeur de la trame que je reçois , si la prochaine est la même je continu à effectué la même action , mais si c'est un valeur différente je fait une autre action , etc

Donc de partir sur une variable qui ne possède aucune valeur, et que je lit une trame je fait une action , je lit la trame suivant je continu l'action , si la trame+n est différente alors je l'enregistre et je fait une autre trame et ainsi de suite.

En tous cas merci de vos conseils , je retourne peaufiné mon programme.

Bonjour à tous ! Je reviens vers vous ! j'ai reussis à mettre en place le système de lecture , à l'aide de deux buffer. J'avais une petite question concernant les buffers.

En gros quand je lit ma première séquence elle est dans mon buffer1 et à la fin de ma boucle je stock la valeur du buffer1 dans le buffer2 et je vide mon buffer1.

Mon petit soucis c'est au niveau de la première lecture, mon buffer1 va alors comparer son contenu avec le buffer2 qui lui est vide. Vous avez une idée de la façon de m'y prendre ?

Je dois initialisé mon buffer2 pour qu'il soit égale au buffer1 ? Ou bien je doit faire en sorte qu'il ne tienne pas en compte le contenu du buffer2 la première fois ?