Liaison série, Réception de la trame

Bonjour a tous ! Je dispose actuellement d’une liaison RS232 pour connecter mon lecteur RFID a mon arduino. J’utilise la laison série pour envoyer des trames a mon lecteur, qui me répond également sous forme de trame. Tout ceci fonctionne avec ce code :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3 ); // RX, TX
const int MODE_TRANSMISSION = 5;
bool x = 1;
void setup()

{
  // Open serial communications and wait for port to open:
  pinMode(MODE_TRANSMISSION, OUTPUT);
  Serial.begin(9600);
  mySerial.begin(9600);
  delay(500);
  digitalWrite(MODE_TRANSMISSION, HIGH);
}

void loop() {
  //if (x == 1) { //run the loop once*
    delay(5000);
    digitalWrite(5,HIGH);
    byte message[] = {0x02, 0x30, 0x30, 0x05, 0x85, 0x03};
    mySerial.write(message, sizeof(message));
    digitalWrite(5,LOW);
    String incomingByte = mySerial.readBytes();
    Serial.print(incomingByte);
    Serial.print(' ');
    
    Serial.println();
    x = 0;  
  //}
  delay(2000);
}

En effet, ce code me renvoie octet par octet toutes les informations de la trame pour lire l’id du badge. Cependant, je cherche a conserver uniquement l’id du badge, l’id du badge étant stocke entre le 12eme et le 17eme octet, je cherche donc a stocke uniquement ces valeurs dans une variable. Cependant, je n’ai pas réussit aprés de nombreux échecs, j’ai notamment essayer a l’aide d’une boucle for d’enregistre dans un tableau, uniquement les valeurs du 12eme au 17eme octet mais ce, sans résultat car l’arduino ne me renvoie aucun résultat exploitable.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3 ); // RX, TX
const int MODE_TRANSMISSION = 5;
bool x = 1;
void setup()

{
  // Open serial communications and wait for port to open:
  pinMode(MODE_TRANSMISSION, OUTPUT);
  Serial.begin(9600);
  mySerial.begin(9600);
  delay(500);
  digitalWrite(MODE_TRANSMISSION, HIGH);
}

void loop() {
  //if (x == 1) { //run the loop once*
  delay(5000);
  digitalWrite(5, HIGH);
  byte message[] = {0x02, 0x30, 0x30, 0x05, 0x85, 0x03};
  mySerial.write(message, sizeof(message));
  digitalWrite(5, LOW);
  int tab[5];
  int tab2[5];
  for (int i = 0; i < 20; i++) {
    tab[i] = mySerial.read();
    if (i < 17 and i >12) {
      tab2[i] = mySerial.read();
      Serial.print(tab2[i], HEX);

    }
    //Serial.print(incomingByte, HEX);
    // Serial.print(' ');

  }
  //int incomingByte = mySerial.read();
  //Serial.print(incomingByte, HEX);
  //Serial.print(' ');

  Serial.println();
  x = 0;
  //}
  delay(2000);
}

Toute aide sera apprécie, merci a tous pour le temps que vous m'accorderez

Avant de faire un mySerial.read() il faut s'assurer qu'il y a des données à lire avec un mySerial.available()

Oui merci de l'information, je viens d'y ajouter mySerial.available. Cependant, mon probléme n'est toujours pas régler et je n'ai tjr pas trouvé de solution :confused: Merci de l'aide que vous pourrez m'apportez

Peut-être qu’en mettant le code modifié on pourrait savoir de quoi tu parles.

  int tab[5];
  int tab2[5];
  for (int i = 0; i < 20; i++) {
    tab[i] = mySerial.read();
    if (i < 17 and i >12) {
      tab2[i] = mySerial.read();
      Serial.print(tab2[i], HEX);

    }

Ça cloche de partout de code.

tab et tab2 devraient être des tableaux de uint8_t ou unsigned char.
tab est mal dimensionnée. Recevoir 20 caractères dans un tableau à 5 éléments … aïe

Tu fais une première lecture de la ligne série pour stocker les octets reçus dans la variable tab → OK
Tu fais une deuxième lecture de la ligne série pour stocker les octets reçus dans la variable tab2 → NON !

Si tu as bien reçu les 20 octets attendus fais simplement ceci après la boucle for :

  memcpy(tab2, tab+11, 5);

En utilisant mySerial.available() avant mySerial.read() bien entendu.

Ensuite il serait bien d’ajouter un timeout au cas où un caractère serait loupé ou que le lecteur de réponde pas, et sortir de la boucle en affichant une erreur.

@+