Plusieurs lecteurs RFID serial avec SoftwareSerial

Bonjour,

J’utilise régulièrement un lecteur RFID parallax Serial avec un code comme suit :

#include <SoftwareSerial.h>

#define RFIDEnablePin 3 //Pin that enables reading. Set as OUTPUT and LOW to read an RFID tag
#define RFIDSerialRate 2400 //Parallax RFID Reader Serial Port Speed
#define RxPin 12 //Pin to read data from Reader 
#define TxPin 13  //Pin to write data to the Reader NOTE: The reader doesn't get written to, don't connect this line.
SoftwareSerial RFIDReader(RxPin,TxPin);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  RFIDReader.begin(RFIDSerialRate);
  pinMode(RFIDEnablePin,OUTPUT); 
  digitalWrite(RFIDEnablePin, LOW);
}

int bytesread = 0;
int  val = 0; 
char badgecode[10];

void loop() {
  if((val = RFIDReader.read()) == 10) {   // Check for header 
      bytesread = 0; 
      while(bytesread<11) {                 // Read 10 digit code 
          val = RFIDReader.read(); 
          if((val == 10)||(val == 13)) {   // If header or stop bytes before the 10 digit reading 
            break;                         // Stop reading 
          } 
          badgecode[bytesread] = val;           // Add the digit           
          bytesread++;                     // Ready to read next digit  
      } 
      
      if(bytesread == 10) {                // If 10 digit read is complete 
        for(int x=0;x<10;x++)              //Copy the Chars to a String
        {
          Serial.print(badgecode[x]); // debug
        }
        Serial.println();
      } 
      bytesread = 0;
    }  


  while(RFIDReader.available() > 0) //Burn off any characters still in the buffer
  {
    RFIDReader.read();
  }

  delay(50);
}

Pas de soucis, je peux utiliser les différents pin RX prévus par la lib (à part 14/15 qui en fait ne semblent pas fonctionner!)

Du coup je me suis dit “chouette je vais pouvoir utiliser 5 lecteurs RFID sur le même microcontrôleur en lisant les serial chacun leur tour”
Et en fait… ça se passe pas comme prévu :frowning:

Grossièrement, voici l’idée que je m’étais donnée avec SoftwareSerial:

#define RFID1EnablePin 3 //Pin that enables reading. Set as OUTPUT and LOW to read an RFID tag
#define RFID1SerialRate 2400 //Parallax RFID Reader Serial Port Speed
#define Rx1Pin 12 //Pin to read data from Reader 
#define Tx1Pin 13  //Pin to write data to the Reader NOTE: The reader doesn't get written to, don't connect this line.
SoftwareSerial RFID1Reader(Rx1Pin,Tx1Pin);

#define RFID2EnablePin 4 //Pin that enables reading. Set as OUTPUT and LOW to read an RFID tag
#define RFID2SerialRate 2400 //Parallax RFID Reader Serial Port Speed
#define Rx2Pin A8 //Pin to read data from Reader 
#define Tx2Pin A9  //Pin to write data to the Reader NOTE: The reader doesn't get written to, don't connect this line.
SoftwareSerial RFID2Reader(Rx2Pin,Tx2Pin);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  RFID1Reader.begin(RFID1SerialRate);
  pinMode(RFID1EnablePin,OUTPUT); 
  digitalWrite(RFID1EnablePin, LOW);

  RFID2Reader.begin(RFID2SerialRate);
  pinMode(RFID2EnablePin,OUTPUT); 
  digitalWrite(RFID2EnablePin,LOW);
}

Dès que j’ajoute le RFID2Reader.begin dans le setup, le RFID1Reader cesse d’afficher des résultats (donc à priori de lire).

J’ai essayé de faire lire chacun leur tour comme ici en vain

J’ai essayé de jouer sur les digitalWrite(RFID1EnablePin…) en le passant HIGH dès lors que je voulais l’utiliser… en vain

Certains d’entre vous ont-ils déjà réalisé ce genre de projet ?

Merci beaucoup pour vos retours

jaoustet:
Bonjour,

J’utilise régulièrement un lecteur RFID parallax Serial avec un code comme suit :

#include <SoftwareSerial.h>

Merci beaucoup pour vos retours

Bonsoir
Voir la page software serial

et en particuliers les limitations connues

The library has the following known limitations:

  • If using multiple software serial ports, only one can receive data at a time.

Merci pour ta réponse Artouste.

Je sais bien cela, c'est pour ça que je lis à tour de rôle, malgré cela blocage !

Je pensais que l'utilisation de .listen() règlerait mes soucis mais non

jaoustet:
Merci pour ta réponse Artouste.

Je sais bien cela, c'est pour ça que je lis à tour de rôle, malgré cela blocage !

Je pensais que l'utilisation de .listen() règlerait mes soucis mais non

OK
et ça donne quoi dans ton polling de faire un .flush en sortie et en entrée ?

Artouste:
OK
et ça donne quoi dans ton polling de faire un .flush en sortie et en entrée ?

Désolé je n'ai pas compris

Ici.
Et :

Avant 1.0.x Serial.flush() vidait le buffer entrant, depuis 1.0.x Serial.flush() vide le buffer sortant ...

Hum ok.
Vous souhaitez que je teste ça à quel moment ?

Après chaque lecture d'un des 2 ?

En tout cas d'après mes derniers tests, c'est dès lors que je fais le RFID2Reader.begin que ça pose problème...