Flux de bytes

Bonjour à tous,
Je me gratte la tête actuellement pour "tordre" un sketch afin de détecter dans un flux de bytes, une chaine de bytes successifs prédéfinie (au minimum 3).
J'avoue que pour le coup je ne vois même pas comment faire!!!!
merci pour votre aide

Bonjour,

Il faudrait avoir plus d'information sur ton flux, mais ça ne me semble pas très compliqué.
Tu compare l'octet courant au premier octet de la chaine, si égal tu avances à l'octet suivant de la chaine, si non égal tu reviens au début de la chaine.
Tu fais le même traitement à chaque octet du flux: comparaison de l'octet de la chaine si ok alors octet suivant sino on recommence au début de la chaine. Quand on arrive au dernier octet de la chaine c'est ok.

je vois un peut le process.
Est-il possible de faire une string en fifo et de la comparer à chaque arrivée?

Je ne vois pas trop ce que tu veux dire.
Le fifo c'est couramment utilisé en réception, c'est par exemple le cas de l'objet Serial. Chaque fois que tu lis un octet tu peux le comparer à un octet de ta chaine.

kamill:
Je ne vois pas trop ce que tu veux dire.
Le fifo c'est couramment utilisé en réception, c'est par exemple le cas de l'objet Serial. Chaque fois que tu lis un octet tu peux le comparer à un octet de ta chaine.

Je voulais dire faire une string comme un buffer fifo, c'est à dire que l'octet qui arrive pousse les autres et chasse de ce fait le premier. Pour pouvoir faire une comparaison string à string

Si j'ai bien compris, tu veux garder par exemple les 3 derniers octets arrivés et les comparer à ta chaîne. Ensuite à l'octet suivant tu gardes toujours les 3 derniers octets (en éliminant le plus ancien) et tu compares de nouveau.
Pourquoi pas, ça doit marcher. Mais ça ne me semble pas être la méthode la plus simple ni la plus efficace.

kamill:
Si j'ai bien compris, tu veux garder par exemple les 3 derniers octets arrivés et les comparer à ta chaîne. Ensuite à l'octet suivant tu gardes toujours les 3 derniers octets (en éliminant le plus ancien) et tu compares de nouveau.
Pourquoi pas, ça doit marcher. Mais ça ne me semble pas être la méthode la plus simple ni la plus efficace.

C'était une idée, mais pas forcément la plus efficace.
Pour revenir à ton exemple premier, détecter le premier octet, puis voir si le second match, puis le troisième me semble plus simple effectivement. Dans la pratique ça se traduirait comment?

Par exemple pour une liaison série, ça se traduirait par quelque chose comme ça

const char *chaineATrouver="ABC";

void loop() {
  static int index=0;   // index dans la chaine à trouver
  if (Serial.available())
  {
    char c=Serial.read();
    if (c==chaineATrouver[index])
    {
      index++;
      if (chaineATrouver[index]==0)
      {
        // c'est la fin de la chaine
        // on a trouvé la chaine entière
        // ***** faire le traitement ici *****
      }
    }
    else
    {
      index=0;      // le carcatère ne correspond pas on recommence au début
    }
  }
}

ok, je vois.
En fait l'action peut se réaliser que lorsque index vaut la valeur prédéfinie.
Mais dans mon cas, il faut que je fasse 3 comparaisons: le premier puis le deuxième puis le troisième octet....

C'est bien ce qui est fait dans ce programme. La chaine à trouver a 3 octets -> il y a 3 comparaisons successives.

kamill:
C'est bien ce qui est fait dans ce programme. La chaine à trouver a 3 octets -> il y a 3 comparaisons successives.

pourquoi tu déclares chaineATrouver en char et non en tableau d'octet?

ok, je viens de voir que c'était un pointeur!!! comme
chaineATrouver[]=

la convention d'écriture c'est 0x00, 0x11, 0x22,..... avec comme séparateur une virgule?

C'était un exemple.

Tu peux aussi utiliser un tableau d'octet

const byte chaineATrouver[]={12,13,14};

void loop() {
  static int index=0;   // index dans la chaine à trouver
  if (Serial.available())
  {
    byte c=Serial.read();
    if (c==chaineATrouver[index])
    {
      index++;
      if (index==sizeof chaineATrouver)
      {
        // c'est la fin de la chaine
        // on a trouvé la chaine entière
        // ***** faire le traitement ici *****
      }
    }
    else
    {
      index=0;      // le caractère ne correcpond pas on recommence au début
    }
  }
}