admin管理员组

文章数量:1404763

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:

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));
      }

  }
}

本文标签: cLoRa Arduino data quality is degradedStack Overflow