Probleme d'envois d'un code RFID via bluetooth sur un téléphone

Bonjour à tous,

Je penses être confronté à un problème de communication entre les différents ports séries.
En effet je cherche à récupérer le code RFID d’un tag à partir du serial1 et pouvoir l’écrire à la fois vers le port serie “serial” (envoi sur la console du PC) et vers le port serial du bluetooth pour le récupérer sur le téléphone.

La partie du code de communication bluetooth entre l’arduino et le téléphone fonctionne correctement lors qu’elle exécutée seule.

Code Bluetooth :

    #include <SoftwareSerial.h>

    SoftwareSerial HC06(11,10);  //RX ; TX
    String messageRecu;
    String messageEnvoi;
    
    void setup() {
      Serial.begin(9600);
      HC06.begin(9600);  
    }

    void blue_envoi(){
      if (messageRecu.length() == "dem") //si le tel à envoyer "dem" en lui envois le contenus de messageEnvoi
        {
          HC06.print(messageEnvoi);
          messageRecu="";
          messageEnvoi="";
        }
    }
    
    void blue_recept(){
      while(HC06.available())
        {
          delay(3);
          char c = HC06.read();
          messageRecu += c;
        }
    }
     
    void loop()
    {
        blue_envoi();
        blue_recept();
        
        
        if (messageRecu.length() >0 and messageRecu != "dem")
        {
          Serial.println(messageRecu);
          delay(3);
          messageRecu="";
        }
        else{
          if (messageRecu == "dem"){
            messageRecu="";
          }
        }

        
        
        while(Serial.available())
        {
          if (Serial.available()) {
            delay(3);
            char c = Serial.read();
             HC06.write(c);
            messageEnvoi += c;
          }
        }
        
    }

De même la partie lecture RFID fonctionne correctement lorsqu’elle est exécutée seule

Code RFID :

// Déclaration des variables pour le lecteur RFID
const byte tailleMessageMax = 11;
char messageBrut[tailleMessageMax + 1];
char message[tailleMessageMax];
const char marqueurDeFin = 3;

boolean ecouter()
{
  static byte indexMessage = 0;
  boolean messageEnCours = true;

  while (Serial1.available() && messageEnCours)
  {
    int c = Serial1.read();
    if (c != -1)
    {
      switch (c)
      {
        case marqueurDeFin:
          messageBrut[indexMessage] = '\0';
          indexMessage = 0;
          messageEnCours = false;
          break;
        default:
          if (indexMessage <= tailleMessageMax - 1) messageBrut[indexMessage++] = (char) c;
          else
            break;
      }
    }
  }
  return messageEnCours;
}

String f_lecture_rfid()
{
  if (! ecouter())
  {
    // on a reçu le marqueur de fin
    while (Serial1.available())
    {
      Serial1.read();
    }
    if (sizeof(messageBrut) > 9)
    {
      for (int i = 0; i <= tailleMessageMax + 1; i++)
      {
        message[i] = messageBrut[i + 1];
      }
       Serial.print(strrev(message));
    }
  }
}

void setup()
{
  Serial1.begin(9600, SERIAL_8N2);
   Serial.begin(9600);
}



void loop()
{
  
    f_lecture_rfid();
   

  // ici on peut faire autre chose

}

Seulement dès que j’essaie de rassembler ces deux éléments, ça bloque :confused:
La communication arduino-téléphone par le bluetooth ne fonctionne plus
La lecture RFID fonctionne uniquement que pour le premier passage du tag et la boucle sans fin à l’air de se bloquer

Code rassemblé :

#include <SoftwareSerial.h>

//Déclaration du port série bluetooth
SoftwareSerial HC06(11,10);  //RX ; TX

//Déclaration des variable d'envoie et de reception du bluetooth
String messageRecu;
String messageEnvoi;

// Déclaration des variables pour le lecteur RFID
const byte tailleMessageMax = 11;
char messageBrut[tailleMessageMax + 1];
char message[tailleMessageMax];
const char marqueurDeFin = 3;



void setup()
{
     Serial1.begin(9600, SERIAL_8N2);
     Serial.begin(9600);
     HC06.begin(9600); 
}



void loop()
{
		// Ecoute et enregistrement d'un code RFID 
		f_lecture_rfid();
		
		blue_envoi();
        blue_recept();
        
        
        if (messageRecu.length() >0 and messageRecu != "dem")
        {
          Serial.println(messageRecu);
          delay(3);
          messageRecu="";
        }
        else{
          if (messageRecu == "dem"){
            messageRecu="";
          }
        }

        
        
        while(Serial.available())
        {
          if (Serial.available()) {
            delay(3);
            char c = Serial.read();
             HC06.write(c);
            messageEnvoi += c;
          }
        }
  // ici on peut faire autre chose

}




// FONCTION RFID
	//Fonction de traduction du code RFID lors de la detectiob d'un tag RFID
	String f_lecture_rfid()
	{
	  if (! ecouter())
	  {
		// on a reçu le marqueur de fin
		while (Serial1.available())
		{
		  Serial1.read();
		}
		if (sizeof(messageBrut) > 9)
		{
		  for (int i = 0; i <= tailleMessageMax + 1; i++)
		  {
			message[i] = messageBrut[i + 1];
		  }
		   Serial.print(strrev(message));	//envoie du contenue dans la console sur le PC
		   messageEnvoi=strrev(message);	//mise en variable du message pour envoie du contenue par bluetooth
		}
	  }
	}



	boolean ecouter()
	{
	  static byte indexMessage = 0;
	  boolean messageEnCours = true;

	  while (Serial1.available() && messageEnCours)
	  {
		int c = Serial1.read();
		if (c != -1)
		{
		  switch (c)
		  {
			case marqueurDeFin:
			  messageBrut[indexMessage] = '\0';
			  indexMessage = 0;
			  messageEnCours = false;
			  break;
			default:
			  if (indexMessage <= tailleMessageMax - 1) messageBrut[indexMessage++] = (char) c;
			  else
				break;
		  }
		}
	  }
	  return messageEnCours;
	}

	
// FONCTION BLUETOOTH		

		//Fonction de reception par bluetooth
		void blue_recept(){
		  while(HC06.available())
			{
			  delay(3);
			  char c = HC06.read();
			  messageRecu += c;
			}
		}
		
		// Fonction d'envoie par bluetooth
		void blue_envoi(){
		  if (messageRecu.length() == "dem")
			{
			  HC06.print(messageEnvoi);
			  messageRecu="";
			  messageEnvoi="";
			}
		}

Malgrés mes recherches sur le net, je n’ai pas réussis à comprendre d’où viens le problème.

J’espere que vous saurez m’aider dans sa résolution.

En vous remerciant :slight_smile:

Quel Arduino ?

C'est un arduino Mega

vous avez 4 ports Séries materiel, donc n'utilisez pas Software Serial...
(et n'utilisez pas la classe String)

Si vous voulez comprendre comment bien écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

Rebonjour,

Je vous remercie pour ces informations et votre tuto enrichissant :slight_smile: .
En suivant vos conseil, j’ai recommencé le code pour communiquer avec le bluetooth. Cela fonctionne correctement avec le code suivant en branchant le lecteur bluetooth sur le serial0 :

const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'

const char marqueurDeFin = '#';

boolean ecouter()
{
  static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
  boolean messageEnCours = true;

  while (Serial.available() && messageEnCours) {
    int c = Serial.read();
    Serial.println(c);
    if (c != -1) {
      
      //Serial.print((char) c);;
      switch (c) {
        case marqueurDeFin:
          message[indexMessage] = '\0'; // on termine la c-string
          indexMessage = 0; // on se remet au début pour la prochaine fois
          messageEnCours = false;
          break;
        default:
          if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
          //else Serial.println(F("j'ignore!"));
          break;
      }
    }
  }
  return messageEnCours;
}

void setup() {
 
  Serial.begin(9600);
}

void loop() {
  if (! ecouter()) {
    // on a reçu le marqueur de fin
    Serial.print(message);
  }

  // ici on peut faire autre chose

}

Mais dès que je modifie le code pour brancher le module bluetooth sur le serial1 pour communiquer le message vers le serial0 (pour voir le message dans la console), cela ne marche plus :

const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'

const char marqueurDeFin = '#';

boolean ecouter()
{
  static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
  boolean messageEnCours = true;

  while (Serial1.available() && messageEnCours) {
    int c = Serial1.read();
    
    if (c != -1) {
      
      //Serial.print((char) c);;
      switch (c) {
        case marqueurDeFin:
          message[indexMessage] = '\0'; // on termine la c-string
          indexMessage = 0; // on se remet au début pour la prochaine fois
          messageEnCours = false;
          break;
        default:
          if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
          //else Serial.println(F("j'ignore!"));
          break;
      }
    }
  }
  return messageEnCours;
}

void setup() {
  Serial1.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if (! ecouter()) {
    // on a reçu le marqueur de fin
    Serial.print(message); //affichage du message du bluetooth (serial1) dans la console PC (Serial0)
  }

  // ici on peut faire autre chose

}

Je ne comprends pas ce qui ne convient pas.

Serial est connecté à votre PC par USB, donc il ne faut pas l'utiliser pour autre chose (et vous pouvez garder cette connexion à 115200 bauds, pas de soucis pour parler "vite" entre votre PC et Arduino)

est-ce que votre module BT est en 3.3V ou il supporte bien le 5V?

êtes vous sûr qu'il est à 9600 bauds?

si vous ne mettez pas en commentaire      //Serial.print((char) c); est-ce que vous voyez du "bavardage"

ça ce n'est pas bon:const char marqueurDeFin = '#';cherchez plutôt les '\n' pour recevoir des lignes (votre HM06 n'envoie pas de '#' en fin de séquence)

En dé-commentant la ligne //Serial.print((char) c); , il n'y a pas de bavardage. Je ne réussis pas à afficher ce que je récupère du serial1 sur le PC (Serial).

Le code fonctionne seulement si le module hc-06 est relié au tx0 et rx0, mais dès que je le branche sur tx1 et rx1, je n'arrive pas à récupérer les valeurs de serial1 pour les transférer au PC (Serial).

Pour la tension je pense qu'il fonctionne en 3.3V (c'est ce qu'il y d'indiqué dessus).

Je vous remercie pour le temps que vous me consacrez :slight_smile:

Alors faut pas le connecter au 5V.... j’espère que vous ne l’avez pas flingué...

Si ça marche sur Serial (c’est louche parce que votre pc est là aussi) y’a pas de raison que ça ne marche pas ailleurs.. essayez sur Serial2 ou 3

Non non, je ne l’ai pas branchée au 5V :slight_smile:

C’est juste que le bout de code qui récupère les valeurs du Serial1 ne veut pas affiché les valeur dans le PC avec le Serial0 :

 while (Serial1.available() && messageEnCours) {
    int c = Serial1.read();

    if (c != -1) {
     
      Serial.print((char) c); // aucune valeurs ne remonte sur l'ordi :(

Ca ne fonctionne pas non plus sur Serial2 :

const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'

const char marqueurDeFin = '\n';

boolean ecouter()
{
  static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
  boolean messageEnCours = true;

  while (Serial2.available() && messageEnCours) {
    int c = Serial2.read();
   
    if (c != -1) {
     
      Serial.print((char) c);
      switch (c) {
        case marqueurDeFin:
          message[indexMessage] = '\0'; // on termine la c-string
          indexMessage = 0; // on se remet au début pour la prochaine fois
          messageEnCours = false;
          break;
        default:
          if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
          //else Serial.println(F("j'ignore!"));
          break;
      }
    }
  }
  return messageEnCours;
}

void setup() {
Serial2.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if (! ecouter()) {
    // on a reçu le marqueur de fin
    Serial.print(message); //affichage du message du bluetooth (serial1) dans la console PC (Serial0)
  }

  // ici on peut faire autre chose

}

C’est louche... mais d’un autre côté le module BT ne dit rien tant que vous ne lui envoyez rien...

Il est appairé ? Vous lui envoyez des data ?

Oui je l'ai appairer avec une appli simple que j'ai faite avec appinventor et lorsque le bluetooth est branché sur serial0 tout fonctionne et je récupère bien la chaine sur le PC mais dès que je passe le module sur serial1 je n'arrive pas à transférer la chaine sur le PC avec serial0 :frowning:

Quand il est branché sur le Serial (y'a pas de 0) il est en conflit avec le port USB... donc c'est pas top...

vous avez bien croisé les fils pour Serial1?

Oui j'ai testé les deux rx du module sur tx1 (tx du module sur rx1) et vice versa.

Je n'arrive pas a trouver de tuto qui utilise le module sur serial1 et qui récupère les valeurs sur serial ...

Faites une loop toute simple qui lit Serial1 et renvoie sur Serial (et postez le code)