-1

The Arduino code I'm writing has an issue with the quality of the transmission.

I"m using the SoftwareSerial library to send and receive data between 2 LoRa chips. The code and Arduino module run correctly, but the data quality is degraded upon receiving (in my example I am sending ''Hello'' but at each iteration, the data received is different).

It seems SoftwareSerial works badly at 115200 bauds, but this is the frequency my Lora chip takes (REYLX RYLR896) and it seems I can't use another LoRa frequency (or can I ?)

Below the response from the terminal:

enter image description here

Emitter Arduino code

#include <Arduino.h>
#include <SoftwareSerial.h>

// Création de l'instance SoftwareSerial pour le module LoRa sur les broches 2 (RX) et 3 (TX)
SoftwareSerial loraSerial(2, 3);  // RX, TX

// Fonction pour vider complètement le buffer de réception de loraSerial
void clearSerialBuffer() {
  while (loraSerial.available()) {
    loraSerial.read();
  }
}

// Fonction pour envoyer une commande AT via loraSerial et lire la réponse
void sendCommand(String cmd) {
  cmd.trim();  // Supprime les espaces superflus

  // Envoi de la commande AT avec terminaison "\r\n"
  loraSerial.print(cmd);
  loraSerial.print("\r\n");
  loraSerial.flush();  // Attendre que la transmission soit terminée
  delay(200);          // Laisser un délai pour que le module traite la commande

  // Lecture de la réponse du module
  String response = "";
  unsigned long startTime = millis();
  while (millis() - startTime < 2000) {
    if (loraSerial.available()) {
      response += loraSerial.readString();
    }
  }
  // Affichage dans le moniteur série (debug)
  Serial.print("Réponse pour ");
  Serial.println(cmd);
  Serial.println(response);

  // Vider le buffer pour la prochaine commande
  clearSerialBuffer();
}

// Fonction pour envoyer un message LoRa et lire la réponse
bool sendLoRaMessage(String message) {
  String command = "AT+SEND=2," + String(message.length()) + "," + message;
  // Envoi de la commande avec terminaison "\r\n"
  loraSerial.print(command);
  loraSerial.print("\r\n");
  loraSerial.flush();
  
  // Attendre la réponse du module
  String response = "";
  unsigned long startTime = millis();
  while (millis() - startTime < 2000) { 
    if (loraSerial.available()) {
      response += loraSerial.readString();
    }
  }
  
  // Afficher la réponse pour le débogage
  Serial.print("Réponse pour ");
  Serial.println(command);
  Serial.println(response);
  
  // Vider le buffer
  clearSerialBuffer();

  // Vérifier si la réponse contient une erreur
  if (response.indexOf("+ERR=") != -1) {
    Serial.println("❌ ERREUR DETECTÉE !");
    return false;
  } else {
    Serial.println("✅ Message envoyé avec succès !");
    return true;
  }
}

void setup() {
  // Initialisation du port série matériel pour le débogage
  Serial.begin(115200);
  delay(500);

  // Initialisation de loraSerial pour communiquer avec le module LoRa
  loraSerial.begin(115200);
  delay(500);

  // Réinitialiser le module LoRa
  sendCommand("AT+RESET");
  delay(500);
  
  // Configuration du module LoRa
  sendCommand("AT+ADDRESS=1");       // Définir l'adresse du module
  delay(200);
  sendCommand("AT+NETWORKID=1");     // Définir l'ID du réseau
  delay(200);
  sendCommand("AT+BAND=915000000");  // Définir la fréquence à 915 MHz
  delay(200);
  
  // Vérifier la configuration (si la commande de lecture est supportée)
  sendCommand("AT+NETWORKID?");
}

void loop() {
  // Envoyer un message simple "A" via LoRa
  bool success = sendLoRaMessage("HELLO");

  if (!success) {
    Serial.println("⚠️ Erreur détectée, attente de 5 secondes avant un nouvel essai...");
    delay(5000);
  } else {
    delay(4000); // Pause normale entre les envois
  }
}

Receiver Arduino code

#include <Arduino.h>
#include <SoftwareSerial.h>

// Crée une instance SoftwareSerial pour le module LoRa sur les broches 8 (RX) et 9 (TX)
SoftwareSerial loraSerial(2, 3); // RX, TX

// Fonction pour vider complètement le buffer de réception de loraSerial
void clearSerialBuffer() {
  while (loraSerial.available()) {
    loraSerial.read();
  }
}

// Fonction pour envoyer une commande AT via loraSerial et lire la réponse
void sendCommand(String cmd) {
  cmd.trim();  // Supprime les espaces superflus

  // Envoi de la commande AT avec terminaison "\r\n"
  loraSerial.print(cmd);
  loraSerial.print("\r\n");
  loraSerial.flush();  // Attendre que la transmission soit terminée
  delay(200);          // Laisser un délai pour que le module traite la commande

  // Lecture de la réponse du module
  String response = "";
  unsigned long startTime = millis();
  while (millis() - startTime < 2000) {
    if (loraSerial.available()) {
      response += loraSerial.readString();
    }
  }
  // Affichage dans le moniteur série (debug)
  Serial.print("Réponse pour ");
  Serial.println(cmd);
  Serial.println(response);

  // Vider le buffer pour la prochaine commande
  clearSerialBuffer();
}


void setup() {
  // Initialisation du port série matériel pour le débogage
  Serial.begin(115200);
  delay(500);

  // Initialisation de loraSerial pour communiquer avec le module LoRa
  loraSerial.begin(115200);
  delay(500);

  // Réinitialiser le module LoRa
  sendCommand("AT+RESET");
  delay(500);
  
  // Configuration du module LoRa
  sendCommand("AT+ADDRESS=2");       // Définir l'adresse du module
  delay(200);
  sendCommand("AT+NETWORKID=1");     // Définir l'ID du réseau
  delay(200);
  sendCommand("AT+BAND=915000000");  // Définir la fréquence à 915 MHz
  delay(200);
  
  // Vérifier la configuration (si la commande de lecture est supportée)
  Serial.println("Récepteur LoRa prêt.");
}


void loop() {
  // Vérifier si des données sont disponibles provenant du module LoRa
  if (loraSerial.available()) {
    // Lire la chaîne de caractères jusqu'à la fin de ligne (retour chariot ou saut de ligne)
    String receivedMessage = loraSerial.readStringUntil('\n');
    receivedMessage.trim(); // Supprime les espaces et retours chariots en trop
    if (receivedMessage.length() > 0) {
      Serial.print("Message reçu : ");
      Serial.println(receivedMessage);
    }
      // Analyser le message pour extraire l'adresse, le contenu et le RSSI
      int firstCommaIndex = receivedMessage.indexOf(',');
      int secondCommaIndex = receivedMessage.indexOf(',', firstCommaIndex + 1);
      int thirdCommaIndex = receivedMessage.indexOf(',', secondCommaIndex + 1);

      if (firstCommaIndex != -1 && secondCommaIndex != -1 && thirdCommaIndex != -1) {
        String length = receivedMessage.substring(firstCommaIndex+1,secondCommaIndex); // Extrait l'adresse
        String message = receivedMessage.substring(secondCommaIndex+1,thirdCommaIndex); // Extrait le message
        String rssiStr = receivedMessage.substring(thirdCommaIndex + 1); // Extrait le RSSI

        // Convertir le RSSI en float
        float rssi = rssiStr.toFloat();

        // Afficher les informations extraites
        Serial.print("Longueur du message : ");
        Serial.println(length);
        Serial.print("Message reçu : ");
        Serial.println(message);
        Serial.print("RSSI : ");
        Serial.println(rssi);
        Serial.println(receivedMessage.substring(9,14));
      }

  }
}

enter image description here

2
  • May be a better site for this question arduino.stackexchange.com
    – 3CxEZiVlQ
    Commented Mar 10 at 16:02
  • 115,200 bauds is not the LoRa chip's frequency, but the UART's. This is a managed chip, ie there's a small MCU between your MCU and the LoRa chip itself. There could be any number of reasons why the transmission is slightly garbled, starting with holding the two modules too close, to bad antennas, and others.
    – dda
    Commented Mar 10 at 22:40

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.