Problème de communication via SoftwareSerial

Bonjour à toutes et à tous,

Je souhaite faire un échange entre deux Pro Mini via SoftwareSerial, mais j'ai des problèmes.

Voici un sketch qui fonctionne. Encore que ...

Sketch du Pro Mini demandeur (qui est connecté à mon PC) :

#include <SoftwareSerial.h>

SoftwareSerial softSerial(5, 6); // RX, TX
String strVI;

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

void loop() {
  if(Serial.available() && Serial.read() == 'M') { // Si je tape ça au clavier
    softSerial.println("MES"); // j'envoie ça à un autre pro mini
    Serial.println("Envoyé");
 }
  if (softSerial.available()) { // si l'autre pro mini répond
    strVI = softSerial.readStringUntil('#'); // je lis ce qu'il me retourne
    Serial.println(strVI); // j'affiche ce que j' ai reçu
    Serial.println("Reçu");
  }
}

et le sketch du Pro Mini répondeur (qui est alimenté par une source de 5 v indépendante) :

#include <SoftwareSerial.h>

SoftwareSerial softSerial(5, 6); // RX, TX

void setup() { 
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  softSerial.begin(9600);
}

void loop() {
  String str;
  if(softSerial.available()) {
    str = softSerial.readString();
//    if (str == "MES") {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000); // simulation du temps pris par ce que je dois faire
    softSerial.println(str);
//    }
  }
  digitalWrite(LED_BUILTIN, LOW);
}

J'obtiens bien une réponse (la LED du Pro Mini répondeur s'allume) :

09:28:42.925 -> Envoyé
09:28:45.957 -> MES
09:28:45.957 -> 
09:28:45.957 -> 
09:28:45.957 -> Reçu

Le String envoyé "MES" est bien reçu et bien retourné. Encore que je ne comprends pas les deux lignes vides de la réponse.

Maintenant, puisque le String "MES" est bien reçu par le Pro Mini répondeur, je modifie son sketch pour faire un test sur cette valeur :

void loop() {
  String str;
  if(softSerial.available()) {
    str = softSerial.readString();
    if (str == "MES") { // Test sur cette valeur quio est reconnue
      digitalWrite(LED_BUILTIN, HIGH);
      delay(1000); // simulation du temps pris par ce que je dois faire
      softSerial.println(str);
    }
  }
  digitalWrite(LED_BUILTIN, LOW);
}

Et bien ça ne fonctionne plus. Le Pro Mini répondeur n'allume plus sa LED et je n'ai pas de réponse.

Puisque "MES" est bien reconnu, pourquoi n'est-il pas accepté ?

Est-ce un problème de syntaxe sur le test ?
...

Merci de vos avis.

Pierre.

Bon, j'ai trouvé ce qui n'allait pas. Je commençais à m'en douter, c'était la comparaison de String avec le ==.
J'ai remplacé cette comparaison par :

    str = softSerial.readString();
    if (str.compareTo("MES") { // Test sur cette valeur qui est reconnue

et bien, ça fonctionne.

Pour autant, je ne comprends toujours pas les deux lignes vides dans la réponse.

Cordialement.

Pierre.

BonjourChPr

Est ce que les GND des 2 Arduino sont bien mis ensemble?

Peut être les \n\r en fin de chaîne reçue, à la réception fais un trim()

str = softSerial.readString();
str.trim();
strVI = softSerial.readStringUntil('#'); // je lis ce qu'il me retourne
strVI.trim();

Tu attends # alors que tu ne le mets pas à l'émission.

Tu ne mets pas ce que tu attends comme terminaison, donc c'est bloqué 1 seconde (timout)

A+
Cordialement
jpbbricole

Merci jpbbricole pour ces informations.

Oui, les GND sont connectés.

Le "#" : j'ai oublié de le supprimer dans mon exemple qui est un raccourci de mon sketch total : pas grave.

En faisant un trim() dans la partie réponse, ça ne fait rien. En le faisant dans la partie demande, cela supprime juste une ligne vide sur les deux.

11:58:16.116 -> Envoyé
11:58:17.440 -> +2.470666e+08;+2.470665e+07 // ça, c'est le résultat avec mon code complet
11:58:17.485 -> Reçu
11:58:18.464 -> 
11:58:18.464 -> Reçu

Par contre, si je remplace le trim() par :

    Serial.println(softSerial.readBytes(buff, 32));

Je n'ai plus de ligne vide et plus qu'un seul "reçu" : la boucle Serial.available() n'est plus parcourue qu'une seule fois. Deux octets ont été supprimés.

13:07:15.860 -> Envoyé
13:07:18.189 -> 2
13:07:18.189 -> +2.470666e+08;+2.470665e+07
13:07:18.221 -> Reçu

Cordialement.

Pierre.

Bonjour Pierre

Une petite chose, si tu lis le port série ainsi, tu ne lui dit pas quand c'est la fin, donc il attend le timout qui est de une seconde
Tu peux accélérer la chose en paramétrant ce timout:
softSerialSerial.setTimeout(50);
par exemple.

Mise à part ça, ça fonctionne ou tu as toujours des problèmes?

Cordialement
Jean-Pierre

Merci jpbbricole pour cette remarque utile qui me fait gagner une seconde sur ce traitement.

Maintenant, tout fonctionne correctement.

Cordialement.

Pierre.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.