[Non réglé]Quelques soucis entre le moniteur série et software serial

Bonjour à tous,
je réalise, comme beaucoup d’autres étudiants un projet de fin d’année en bachelor de technologie à l’ENSAM. Il s’agit d’une borne antivol pour vélo. Une partie de programmation via Arduino est nécessaire, car nous souhaitons que la borne se déverrouille par Bluetooth via une appli mobile, ou par nfc, en posant son téléphone dessus.
J’ai donc réalisé un programme ainsi que l’appli et tout fonctionne parfaitement pour la partie Bluetooth.
Je m’accroche donc à présent à la partie nfc, qui me semble plus ardu.
J’ai déja eu la déception d’apprendre que le téléphone ne possèdait pas d’UID fixe et de ce fait je ne pourrai pas m’en servir comme clé de déverrouillage. Nous nous sommes donc tournés vers notre carte étudiant.
J’utilise un module nfc DFR0231 qui utilise un pn532.
Ma version d’arduino est 1.8.9 et j’utilise une arduino uno.
La carte ne possèdant pas plusieurs ports de communication série et l’unique disponible étant utilisé par le module bluetooth HC-05, je me suis donc, après quelques recherches, tourné vers software serial pour mon module nfc. Je l’ai donc connecté aux ports 2 et 3 en les ayant défini comme des ports de communication.
Mon problème est que lorsque j’ouvre mon moniteur série et que je règle les bauds sur 112500, aucun message n’apparait sur l’interface, contrairement à ce qui est demandé dans le programme. Je serai donc heureux si quelqu’un pourrait m’eclairer sur ce point, car je n’ai pas une très grande expérience en C++ pour le moment ::slight_smile:
Voici mon code, qui n’est pas encore achevé mais qui montre le nécéssaire.

#include <SPI.h>
#include <Adafruit_PN532.h>
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);      // RX, TX
String inputString = "";
String command = "";
String value = "";
String password = "picto";
boolean stringComplete = false;
const int myelectro = 7;
Adafruit_PN532 nfc(rxPin,txPin);


void setup()
{
  Serial.begin(9600);// baud rate is 9600 must match with bluetooth
  mySerial.begin(115200);
  mySerial.print("Start");
  nfc.begin();
  pinMode(myelectro,OUTPUT);
 
  
  inputString.reserve(50);  
  command.reserve(50);
  value.reserve(50);

  boolean stringOK = false;
  digitalWrite(myelectro, HIGH);
    uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    mySerial.print("Didn't find PN53x board");
    while (1);
  }

  mySerial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  mySerial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  mySerial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

 
  nfc.setPassiveActivationRetries(0xFF);

  // configure board to read RFID tags
  nfc.SAMConfig();

  mySerial.println("Waiting for an ISO14443A card");
}


void loop() 
{
  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  

  uint8_t uidLength;       
  unsigned long readID =0;

  
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  if (success) {
    Serial.println("Found a card!");
    Serial.print("UID Value: ");
      for (uint8_t i=0; i < uidLength; i++) 
      {
        Serial.print(" 0x");Serial.print(uid[i], HEX); 
        readID += uid[i];
        if(i < (uidLength -1)){
          readID = readID << 8;
}
      }
      }
  if (stringComplete) {
   
    delay(100);
    
    int pos = inputString.indexOf('=');
      if (pos > -1) {
   
      command = inputString.substring(0, pos);
     cause error
      value = inputString.substring(pos + 1, inputString.length() - 1); 
     

            if (!password.compareTo(value) && (command == "OPEN")) {
       
        openDoor(); 
        Serial.println(" OPEN"); 
        delay(100);
      }
      else if (!password.compareTo(value) && (command == "CLOSE")) {
    
        closeDoor();
        Serial.println(" CLOSE"); 
        delay(100);
      }
      else if (password.compareTo(value)) {

        Serial.println(" WRONG");
        delay(100);
      }
    }

    inputString = "";
    stringComplete = false;
  }
}


void serialEvent() {
  while (Serial.available()) {
   
    char inChar = (char)Serial.read();

  
    inputString += inChar;
 
    // so the main loop can do something about it:
    if (inChar == '\n' || inChar == '\r') {
      stringComplete = true;
    }
  }
}

void openDoor() {
  digitalWrite(myelectro, LOW);
  delay(100);
}

void closeDoor() {
  digitalWrite(myelectro, HIGH);
  delay(100);
}

Merci et bonne soirée à tous!

pas bien compris de quelle "interface" vous parlez.. votre code en utilisant mySerial.print va parler au module NFC.... pas à la console série...

115200 c'est bcp pour software Serial, vous avez intérêt à mettre le bluetooth à 9600 en soft Serial et garder le port natif pour le NFC

Tout d'abord merci pour votre réponse.
Je vais appliqué votre conseil pour ce qui est d'intervertir le module nfc et le module bluetooth.
En fait je voudrais vérifier si mon début de programme fonctionne bien sauf que lorsque j'ouvre le moniteur série pour pouvoir voir les communications entre le module nfc et l'arduino, je ne reçois aucun message, contrairement à ceux que j'ai paramétré dans mon programme. Peut-être m'y suis-je mal pris?
Très cordialement, Aymeric

lorsque j'ouvre le moniteur série pour pouvoir voir les communications entre le module nfc et l'arduino, je ne reçois aucun message, contrairement à ceux que j'ai paramétré dans mon programme

vous n'avez rien paramétré de tel dans votre code.

ce qui est connecté sur le port USB ce sont les pins 0 et 1. c'est câblé en dur et on y accède par l'objet Serial

comme vous l'avez câblé avec le module BT, vous ne pouvez pas avoir en même temps la console ouverte

si vous voulez débuger il faudrait 3 ports séries. un pour le BT, un pour le NFC et le port standard pour la console série de votre mac/pc (ne pas utiliser 2 ports SoftwareSerial)

D’accord, je comprends, mais de ce fait, comment pouvoir vérifier si ce que je fais avec mon module nfc dans mon programme est adapté à l’utilisation que je souhaite lui faire faire?
Merci bcp de votre aide.

pour apprendre à vous servir de votre NFC, virez le module BT et jouez avec Sowftare Serial en conservant Serial pour votre connexion à l'ordi et au debug.

une fois que tout ce que vous voulez tester aura bien fonctionné, passez alors "en aveugle" (ou rajoutez un écran LCD ou utilisez le BT pour envoyer des messages)

D’accord merci pour votre aide, je vais faire ça et vous donne un retour.
Cordialement, Aymeric.

Bon, je viens de mettre mon bluetooth en myserial et mon nfc en serial. j’ai enfin les message sur la console de ma carte, mais mon telephone ne reçoit plus les message open et close qui permettent de vérouiller et deverouiller la borne, ce qui fait que lorsque je clicque sur l’un des deux boutons plus rien ne se passe, malgré que j’arrive à me connecté au module bluetooth. Je ne trouve pas l’erreur, désolé

#include <SPI.h>
#include <Adafruit_PN532.h>
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);      // RX, TX
String inputString = "";
String command = "";
String value = "";
String password = "picto";
boolean stringComplete = false;
const int myelectro = 7;
Adafruit_PN532 nfc(0,1);


void setup()
{
  Serial.begin(112500);// baud rate is 9600 must match with bluetooth
  mySerial.begin(9600);
  Serial.print("Start");
  nfc.begin();
  pinMode(myelectro,OUTPUT);
 

  inputString.reserve(50);  
  command.reserve(50);
  value.reserve(50);

  boolean stringOK = false;
  digitalWrite(myelectro, HIGH);
    uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }


  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);


  nfc.setPassiveActivationRetries(0xFF);


  nfc.SAMConfig();

  Serial.println("Waiting for an ISO14443A card");
}


void loop()
{
  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID

  uint8_t uidLength;        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
  unsigned long readID =0;


  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  if (success) {
    Serial.println("Found a card!");
    Serial.print("UID Value: ");
      for (uint8_t i=0; i < uidLength; i++) 
      {
        Serial.print(" 0x");Serial.print(uid[i], HEX); 
        readID += uid[i];
        if(i < (uidLength -1)){
          readID = readID << 8;
}
      }
      }
  if (stringComplete) {

    delay(100);
 
    int pos = inputString.indexOf('=');

    if (pos > -1) {
          value = inputString.substring(pos + 1, inputString.length() - 1); // extract command up to \n exluded
    

            if (!password.compareTo(value) && (command == "OPEN")) {
       
        openDoor(); 
        mySerial.println(" OPEN"); // sent open feedback to phone
        delay(100);
      }
      else if (!password.compareTo(value) && (command == "CLOSE")) {
   
        closeDoor();
        mySerial.println(" CLOSE"); // sent " CLOSE" string to the phone
        delay(100);
      }
      else if (password.compareTo(value)) {
     
        mySerial.println(" WRONG");
        delay(100);
      }
    }

    inputString = "";
    stringComplete = false;
  }
}


void serialEvent() {
  while (mySerial.available()) {

    char inChar = (char)mySerial.read();

    inputString += inChar;
   
    if (inChar == '\n' || inChar == '\r') {
      stringComplete = true;
    }
  }
}

void openDoor() {
  digitalWrite(myelectro, LOW);
  delay(100);
}

void closeDoor() {
  digitalWrite(myelectro, HIGH);
  delay(100);
}

Je ne comprends pas ... si vous avez le lecteur NFC accroché en 0 et 1 pourquoi balancez vous de Serial.print() pour debug ?

Comme je vous l’ai déjà dit - Vous ne pouvez pas avoir à la fois la console série ET le lecteur nfc sur les mêmes pins

Ensuite un code qui gère le port série ne doit-on pas avoir de delay trop longs... en 100ms (du delay(100)) à 115200 bauds vous allez recevoir potentiellement 1152 octets alors que le buffer pour les conserver n’en compte que 64... lisez les tutos sur comment bien gérer le port série (et laissez tomber la classe String, sur un UNO ça va vous jouer des tours)