Recevoir 2 trames avec un nombre d'octet différent

Bonjours, je vous explique mon problème. J'ai un capteur de porte qui m'envois une trames de 21 octet, sur ces 21 octets je lis que 14 octets( ce sont les seuls qui m’intéresse). Ensuite je reçois un trame d'un détecteur de mouvement de 24 octet et je lis que 7 octets. Problème, je sais pas comment réunir mes deux programme, car ils marchent mais lors de l’intégration je ne récupère qu'une trame...

bonjour elles arrivent comment ces trames ? sur le meme serial toujours l'une suivie de l'autre ou elles peuvent arriver indépendamment, voir meme se "chevaucher" ?

Elles arrivent par RX/TX de la micro toutes les deux et c'est moi qui les déclencheraient l'une après l'autre

corentinleduc13560: Elles arrivent par RX/TX de la micro toutes les deux et c'est moi qui les déclencheraient l'une après l'autre

il faut regarder la valeur de Serial.available() lue apres une tempo legerement superieure au temps de trame 24 octets , la tempo debutant dés que Serial.available() reçoit le 1er octet.

A la fin de tempo selon que Serial.available() contient 21 ou 24 tu sais quelle type de trame tu va lire et traiter. Il faut bien sur que le temps intertrame soit bien > au temps de trame 24 octets

Je n'arrive pas a comprendre comment faire ça en arduino.. Avez vous un exemple ?

Bonjour,

Ca me parait simple à faire

void loop() {
  byte buffer[24];
  if (Serial.available())
  {
    int cpt=Serial.readBytes(buffer, sizeof buffer);
    if (cpt==21)
    {
      // traitement capteur porte
      // ...
    }
    else
    {
      // traitement capteur de mouvement
      // ...
    }
  }
}

Maintenant ça ne me parait pas très robuste. Qu'est ce qui garanti que les trames seront séparées et qu'elles ne vont pas se superposer?

Car ce sont juste des tests pour un projet, chaques declanchements serais espacés de quelque seconde

Donc le programme que je te propose devrait fonctionner

A quoi correspond le sizeoff ?

à la taille du buffer (24)

Cela ne marche pas… a moins que je n’est pas fais ce qui fallais vu mon niveau…

byte contactO[14]={85, 0, 7, 7, 1, 122, 213, 8,1,128,91,112,0,1}; // Badge rouge
byte contactF[14]={85, 0, 7, 7, 1, 122, 213, 9,1,128,91,112,0,1}; // Badge rouge

byte contactA[14]={85, 0, 7, 7, 1, 122, 213, 0, 1, 128, 91, 112, 0, 1}; // Active alarme

byte mouvement[7]={85, 0, 10, 7, 1, 235, 165}; // Badge rouge

int detecteurLu[24];

int contactLu[21];

int etat=0;

void setup() {

Serial1.begin(57600);
Serial.begin(57600);
}

void loop() {
byte buffer[24];
if (Serial.available())
{
int cpt=Serial.readBytes(buffer, sizeof buffer);
if (cpt==21)
{
for (byte numOctet=0; numOctet<21; numOctet++)
{
while (Serial1.available() <=0);
contactLu[numOctet]=Serial1.read();
}

boolean contactOuvert=true;
boolean contactFerme=true;
boolean contactActive=true;

for (byte numOctet=0; numOctet<14; numOctet++)
{
if ( contactLu[numOctet]!=contactO[numOctet]) contactOuvert=false;
if ( contactLu[numOctet]!=contactF[numOctet]) contactFerme=false;
if ( contactLu[numOctet]!=contactA[numOctet]) contactActive=false;
}
if (contactActive==true)
{

switch (etat) {
case 0:

Serial.println(“Alarme active”);
etat=1;
break;
case 1:
Serial.println(“Alarme desactive”);
etat=0;
digitalWrite(4, LOW);
break;
}
}

if (contactOuvert==true)
{

switch (etat) {
case 0:
Serial.println(“Detection ouverture porte”);

break;
case 1:
Serial.println(“Alarme intrusion”);
digitalWrite(4, HIGH);

break;
}
}
}
else
{
for (byte numOctet=0; numOctet<24; numOctet++)
{
while (Serial1.available() <=0);
detecteurLu[numOctet]=Serial1.read();
}

boolean detectionMouv=true;

for (byte numOctet=0; numOctet<7; numOctet++)
{
if ( detecteurLu[numOctet]!=mouvement[numOctet]) detectionMouv=false;
}
if (detectionMouv==true)
{

switch (etat) {
case 0:
Serial.println(“Detection mouvement”);

break;
case 1:
Serial.println(“Alarme mouvement”);

break;
}
}
}
}
}

je t’envois mon code pour voir si tu trouve une erreur que j’aurai fais… ( désolé pour l’indentation je suis un peux pressé…)

Mets ton programme entre balises code.

Les octets reçus sont déjà dans buffer. Il ne faut pas les relire dans la liaison série.
Si tu veux modifier le minimum ton programme, il faut les recopier dans les buffers que tu utilises comme ceci:

byte contactO[14] = {85, 0, 7, 7, 1, 122, 213, 8, 1, 128, 91, 112, 0, 1}; // Badge rouge
byte contactF[14] = {85, 0, 7, 7, 1, 122, 213, 9, 1, 128, 91, 112, 0, 1}; // Badge rouge

byte contactA[14] = {85, 0, 7, 7, 1, 122, 213, 0, 1, 128, 91, 112, 0, 1}; // Active alarme

byte mouvement[7] = {85, 0, 10, 7, 1, 235, 165}; // Badge rouge

int detecteurLu[24];

int contactLu[21];

int etat = 0;

void setup() {

  Serial1.begin(57600);
  Serial.begin(57600);
}

void loop() {
  byte buffer[24];
  if (Serial.available())
  {
    int cpt = Serial.readBytes(buffer, sizeof buffer);
    if (cpt == 21)
    {
      memcpy(contactLu,buffer,21);  // recopie des octets reçus

      boolean contactOuvert = true;
      boolean contactFerme = true;
      boolean contactActive = true;

      for (byte numOctet = 0; numOctet < 14; numOctet++)
      {
        if ( contactLu[numOctet] != contactO[numOctet]) contactOuvert = false;
        if ( contactLu[numOctet] != contactF[numOctet]) contactFerme = false;
        if ( contactLu[numOctet] != contactA[numOctet]) contactActive = false;
      }
      if (contactActive == true)
      {


        switch (etat) {
          case 0:

            Serial.println("Alarme active");
            etat = 1;
            break;
          case 1:
            Serial.println("Alarme desactive");
            etat = 0;
            digitalWrite(4, LOW);
            break;
        }
      }

      if (contactOuvert == true)
      {

        switch (etat) {
          case 0:
            Serial.println("Detection ouverture porte");

            break;
          case 1:
            Serial.println("Alarme intrusion");
            digitalWrite(4, HIGH);

            break;
        }
      }
    }
    else
    {
      memcpy(detecteurLu,buffer,24);

      boolean detectionMouv = true;


      for (byte numOctet = 0; numOctet < 7; numOctet++)
      {
        if ( detecteurLu[numOctet] != mouvement[numOctet]) detectionMouv = false;
      }
      if (detectionMouv == true)
      {

        switch (etat) {
          case 0:
            Serial.println("Detection mouvement");

            break;
          case 1:
            Serial.println("Alarme mouvement");

            break;
        }
      }
    }
  }
}

Mais le plus efficace serait d’utiliser directement buffer.

Comment utiliser le buffer directement ? Parce qu'avec le programme tu viens de modifier cela marche toujours pas ...

Ca devrait fonctionner. Ce n'est pas la peine de se lancer dans des modifs avant de comprendre pourquoi ça ne fonctionne pas. Si ça ne fonctionne pas, ça doit venir d'autre part. Affiches les informations reçues sur le moniteur série.

Rien ne s'affiche dans le moniteur série.

C'est normal vu que tu n'affiches pas ce que tu reçois. Affiches le contenu de contactLu et detecteurLu

Je viens de voir que tu as déclaré tes tableaux contactLu et detecteurLu comme des int alors que tu recois des octets.

Déclare les comme des octets

byte detecteurLu[24];

byte contactLu[21];

Ca explique que ça ne fonctionne pas car le memcpy que j'utilise suppose que ce sont des octets.

Je reçois que 0,431,0,431,0,431 ect..

fait la modif avec les byte

Tous marche sauf le contact, lorsque je l’ouvre ou je le ferme rien ne s’affiche a par des valeur