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
版权声明:本文标题:c++ - LoRa Arduino data quality is degraded - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744837140a2627700.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论