Kommunikation Datenaustausch zwischen zwei HC12-Funkmodulen

Hallo,

wie schaffe ich es, einige Parameter von einem zu einem anderen HC12-Modul zu senden.

Beim Einschalten beider Geräte sollen Parameter, die im EEPROM vom Sendergerät gespeichert sind an das Empfangsgerät gesendet werden.
Es muss sicher gestellt sein, dass alle Daten richtig und vollständig beim Empfänger angekommen sind.
Erst dann gehen beide Geräte in den Betriebsmodus.

Aktuell ist es so, dass der Empfänger die ganze Zeit "request" an den Sender sendet, dieser aber offensichtlich keine Daten erhält.

Hat jemand eine Idee, wo der Fehler ist?

Danke und Grüße
Tobias

Hier der Code:

SENDER (SERVER)

#include <SoftwareSerial.h>
#define pinTX 12                      // Receiver HC12-Funkmodul
#define pinRX 13                      // Transmitter HC12-Funkmodul

// Menü-Parameter (werden im EEPROM abgespeichert)
int speedRR=1300;
int speedR=300;
int speedLL=1300;
int speedL=300;
int moveR=6400;
int moveL=6400;

SoftwareSerial hc12(pinTX, pinRX);    // Funkmodul 433 MHZ initialisieren

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

void loop() {
  // Übertragen der Menü-Parameter
  String dataString="";
  String requestString = "";
  createDataString(speedRR, speedR, speedLL, speedL, moveR, moveL, dataString);

  while (requestString != "request") {
    //Serial.println("Wait for Request");
    if (hc12.available()) {
      requestString = hc12.readString();
      //Serial.println(requestString);
    }
  }
  //Serial.println(dataString);
  hc12.print(dataString);
  
  // Betrieb   
  while (1) {
    // CODE
  }
}

void createDataString(int data1, int data2, int data3, int data4, int data5, int data6, String &data){
  data = "*" + String(data1) + "*" + String(data2) + "*" + String(data3) + "*" + String(data4) + "*" + String(data5) + "*" + String(data6);
}

EMPFÄNGER (RECEIVER)

#include <SoftwareSerial.h>

#define pinTX 12        // Receiver HC12-Funkmodul
#define pinRX 13        // Transmitter HC12-Funkmodul

// Menü-Parameter (werden vom Transmitter abgerufen)
int speedRR=0;
int speedR=0;
int speedLL=0;
int speedL=0;
int moveR=0;
int moveL=0;

SoftwareSerial hc12(pinTX, pinRX);  // Funkmodul 433 MHZ initialisieren

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

void loop() {
  // Übertragen der Menü-Parameter
  while (!hc12.available()) {
    hc12.print("request"); 
    //Serial.println("sending Request");
  }
  speedRR = hc12.parseInt();
  speedR = hc12.parseInt();
  speedLL = hc12.parseInt();
  speedL = hc12.parseInt();
  moveR = hc12.parseInt();
  moveL = hc12.parseInt();

  // Betrieb  
  while (1) {
    // CODE
  }
}

Hallo tobias4511

Lesen macht schlau:

ja, den Artikel kenn ich jetzt schon beinahe auswendig :wink:
Hilft mir nicht weiter.
habe den Code ja von ihm übernommen (ganz unten auf der Seite).

Irgendwo ist noch ein Fehler

Was genau soll das bewirken ?
Und dein gesendeter "dataString" ist ja auch leer.

Wie sind die Arduinos, oder was du nutzt, mit HC verbunden?
Serial muss auf Kreuz verbunden sein, heißt TX mit RX und RX mit TX

Wenn man der Beschreibung im Sketch glauben darf, ist die Verbindung richtig.
Wobei die durchaus etwas missverständlich sein kann.

nein, dataString ist nicht leer, wird vorher über diese Funktion gesetzt:

createDataString(speedRR, speedR, speedLL, speedL, moveR, moveL, dataString);

Habe erst nach deinem Post genau geschaut auf SoftwareSerial hc12(pinTX, pinRX);
Hast jedoch Recht man weis nie.

Dann sieh dir deinen Sketch nochmal genaustens an.
Ich sehe nirgens wo die Variable gefüllt wird.

Und was ist mit while ?

ich nutze zwei NANOs. und zwei gleiche HC12-Module.
Beide sind genau gleich am Arduino angeschlossen (TX an 10 und RX an 11)

Dann kann es nicht funktionieren.

Das while(1) ist unbedeutend.
Da steht dann mein Code für den Betrieb nach der Übertragung der Parameter.
Schau mal ganz unten die Funktion createDataString, da wird dataString befüllt.
Es wird der Zeiger auf den String übergeben

warum nicht? schau mal bei "Wolle", der hat es genauso angeschlossen

Es kommt nicht drauf an, wie Wolle das macht, sondern wie du es machst.
In deinem Sketch steht es anders.

Wen ich das gut verstehe du baust ein String data willst aber senden dataString und der ist leer wie meine flasche Bier, oder bin auf falschem Dampfer ?

Bin doch bin auf falschem Dampfer. Habe nur den Zusammenbau getestet mit SerMon also sollte der senden ohne dem

 while (1) {
    // CODE
  }
``` die Ausgabe vom dataString

der String = 1300300130030064006400

Flasche Bier rüber reich

Gruß Tommy

1 Like

Danke :wink:

nee, der ist nicht leer, hatte ich zum debuggen im Serial-Monitor ausgegeben

Ich vermisse da ein Return.

brauchts ned, kannst einen String auch direkt über die Startadresse (die der Funktion übergeben wird) ändern