Funksensoren mit Repeatern ausstatten

  • Moin

    Ich koppele die Frage mal aus dem allgemeinen Entwicklungsthread aus.
    Daher zunächst ein paar Zitate, ich hoffe es bleibt verständlich:


    Wir haben erfolgreich einen Repeater eingerichtet.
    D.h. ein Sender sendet an den Repeater. Die erfolgreiche Ankunft des
    Pakets wird über Led-blinken in der CRC-Prüfung angezeigt. Der Repeater
    schaltet um (wechelt ID und Netz) und sendet. Das klappt auch, geprüft
    wurde dies indem wir aus dem Paket, dass der Repeater bekommen hat, die
    ID des Senders extrahiert haben und diese dem Repeater zugewiesen.
    Am Endempfänger kommt dann ein Paket mit der ID des Senders an.
    Soweit alles wie gewünscht.
    Das Problem ist, dass es nicht funktioniert die Nachricht des Senders
    auf dem Repeater auszulesen und diese weiterzuschicken. Am Endempfänger
    kommt immer eine leere Nachricht an.
    Wird im Repeater eine feste Nachricht hinterlegt, wird diese erfolgreich
    (mit ID des Senders) geschickt.

    Die genutze Funktion ist die aus dem Repeater/DS18B20-Sketch.
    Gibt es eine Möglichkeit zu prüfen, ob die Funktionen getDataLen
    bzw getData ordnungsgemäß laufen? Bzw ob überhaupt ein Datenpaket
    vorliegt? Aber das das so ist, sollte ja eigentlich die erfolgreiche CRC
    Prüfung, richtig?

    Tipps in jede Richtung willkommen ;)

    Irgendwo hier:
    [code=php] // Buffer to store incoming data
    const char* inData;
    int i;
    for (byte i = 0; i < *radio.DataLen; i++) //can also use radio.GetDataLen() if you don't like pointers
    #ifdef DEBUG
    mySerial.print((char) radio.Data[i]);
    #endif
    inData += radio.Data[i];

    if (LEDpin) {
    blink(LEDpin, 2);
    }
    if (radio.ACKRequested()) {
    radio.SendACK();
    #ifdef DEBUG
    mySerial.print(" - ACK sent");
    #endif
    }[/php]

    funktioniert es noch nicht.

    Vielen Dank aber schon mal für den Sketch!

    Gruß Kolja

    Edited once, last by kolja (January 9, 2015 at 2:10 AM).

  • Ändern mal die Zeile

    [code=php] inData += radio.Data[i];[/php]

    in:

    [code=php] inData += (char) radio.Data[i];[/php]

    Vollständiger loop() in Repeater.ino:

    Display Spoiler

    [code=php]void loop() {
    if (radio.ReceiveComplete()) {
    if (radio.CRCPass()) {
    int supplyV = readVcc(); // Get supply voltage
    //node ID of TX, extracted from RF datapacket. Not transmitted as part of structure
    byte theNodeID = radio.GetSender();
    // Buffer to store incoming data
    const char* inData;
    int i;
    for (byte i = 0; i < *radio.DataLen; i++) { //can also use radio.GetDataLen() if you don't like pointers
    inData += (char) radio.Data[i];
    }
    if (radio.ACKRequested()) {
    radio.SendACK();
    }
    // Send received data to PI
    setupTransmit();
    radio.Send(T_GATEWAYID, (uint8_t *)inData, strlen(inData), requestACK);
    radio.SendWait(2); //wait for RF to finish sending (2=standby mode, 3=power down)
    setupReceive();
    if (LEDpin) {
    blink(LEDpin, 2);
    }
    } else {
    if (LEDpin) {
    activityLED(1); // LED on
    delay(1000);
    activityLED(0); // LED off
    }
    }
    }
    }[/php]

  • Hallo Leute,

    der Tip mit dem (char) type casting hat leider nicht funktioniert, wir bekommen
    die Nachricht nicht vernünftig zusammengebaut.

    Wenn wir radio.Data einfach an Send geben, wird der erste Eintrag aus radio.Data korrekt übermittelt.

    Gibt es noch eine andere Möglichkeit den String zusammen zu stellen?

  • inData ist nur ein "dummer" char*, kein String. An so einen char* kann man nicht mit += Zeichen anhängen, das geht nur bei String-Objekten.

    Du kannst inData als char-Array definieren und dann z.B. mit strlcpy() Daten hineinkopieren:

    [code=php]char inData[RF12_MAXDATA];

    strlcpy(inData, radio.Data, sizeof inData);
    [/php]

    Oder eben mit einer Schleife:

    [code=php]
    char inData[RF12_MAXDATA];

    int i;
    for (byte i = 0; i < *radio.DataLen; i++) //can also use radio.GetDataLen() if you don't like pointers
    inData[i] = radio.Data[i];
    [/php]

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!