Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delay im loop funktioniert nicht #4

Open
saewert opened this issue Nov 22, 2019 · 7 comments
Open

Delay im loop funktioniert nicht #4

saewert opened this issue Nov 22, 2019 · 7 comments

Comments

@saewert
Copy link

saewert commented Nov 22, 2019

Hallo,
ich habe mit den beiden Funktionen einiges ausprobiert, die Verbindung ist wirklich gut.
Mir ist aufgefallen, das weitere delay() Aufrufe im loop() dazu führen, dass nicht gesendet wird.
Ich vermute mal, dass in der Library auch mit Interrupts und millis() gearbeitet wird und das zu Konflikten führt. Eine eigene Funktion myDelay ( ebenfalls mit millis() ) funktioniert, aber auch nur an der Stelle auch nur einmal zwischen transmitter.send() und transmitter.resend().
Beispiel anbei.
Gibt es eine Idee zur Lösung ?
Vielen Dank

getestet mit UNO und Nano

433-Sender-2-delay.txt

@zeitgeist87
Copy link
Owner

Hallo @saewert,

die Funktion transmitter.send() bzw. transmitter.resend() arbeitet nicht asynchron, sondern blockiert so lange, bis das Paket gesendet wurde. Am einfachsten macht man ein sehr kurzes delay(), wacht dann wieder auf, und sendet mit transmitter.send()

for (;;) {
    transmitter.send(...)
    delay(100)
}

@saewert
Copy link
Author

saewert commented Nov 25, 2019

Hallo,
das habe ich ja auch so wie in Ihrem Beispielcode gemacht: zwischen send und resend gibt es ein delay von 5 Sek.
Nur wenn im loop() vor dem send oder nach dem resend eine weiteres delay aufgerufen wird, erfolgt kein Senden.
Sehen Sie sich bitte dazu mein Beispiel an.

@zeitgeist87
Copy link
Owner

Hmm, ich werde mal schauen, ob ich das Problem reproduzieren kann...

@zeitgeist87
Copy link
Owner

Hallo @saewert,

ich habe ein Testsetup aufgebaut und ich kann das Problem nicht reproduzieren. Dabei ist mir ein kleiner Fehler in Ihrem Code aufgefallen.

Das Array msg[10] ist zu klein. Es braucht noch Platz für den terminierenden Null-Character. Das strlen(msg) kann dadurch nicht feststellen, wo der String zuende ist, was komisches Verhalten auslösen könnte. Ohne delay() enthält der Stack nach dem msg zufällig eine 0. Mit delay() steht dort irgendein Überbleibsel von den Parametern oder der Return-Adresse und strlen() funktioniert nicht mehr. Vielleicht geht es damit:

void loop() {

  //Serial.println(" "); 

char msg[11];

    // delay(10000);    // hier nicht möglich
    
    memcpy(msg, "1234567890", sizeof(msg));

 
  transmitter.send((byte *)msg, strlen(msg) + 1);
       
  Serial.print(" gesendet: ");   Serial.println (msg);
      
  //delay(intervalSend);   // funktioniert
  myDelay(intervalSend);   // funktioniert
  
  transmitter.resend((byte *)msg, strlen(msg) + 1);
  //Serial.println(" Resend: "); 
   /* Nach der Verzögerung 5 Sek wird das vorherige Paket erneut gesendet, um sicherzustellen, 
      dass es empfangen wird, und um Störungen während der ersten Übertragung zu 
      kompensieren.
   */

    // delay(10000);    // hier nicht möglich
}

@saewert
Copy link
Author

saewert commented Nov 27, 2019

Hallo,
vielen Dank für Ihren Tip mit dem char msg[11];
Ich habe Ihren zuletzt geschickten Code übernommen, jetzt funktionieren die Serial.prints.
Serial.print(" gesendet: "); und Serial.println(" Resend: "); werden korrekt ausgegeben.
Nur wenn ich unten den delay(10000); aktiviere, kommt beim Empfänger nichts an.
Die .send und .resend mit den Serial.prints laufen jedoch normal durch.

@saewert
Copy link
Author

saewert commented Apr 30, 2020

Hallo,
ich möchte nochmal nachfragen: haben Sie noch eine Idee, wie den jetzt unten auskommentierten delay (10000) doch nutzen kann, ohne einen Konflikt mit dem transmitter send /.resend zu bekommen ?

@zeitgeist87
Copy link
Owner

Hallo @saewert,

Das .send() und .resend() läuft leider nicht automatisch im Hintergrund. Man muss sich also selber, also von Hand, darum kümmern, dass es immer wieder mal aufgerufen wird. Das ist aber grundsätzlich kein Problem:

void loop() {
  //... setup code ...
  // Ein Mal send aufrufen
  transmitter.send((byte *)msg, strlen(msg) + 1);

  // Gesamte Wartezeit in ms
  int delay_ms = 10000;

  while (delay_ms > 0) {
    // Eine Sekunde schlafen
    delay(1000);
    delay_ms -= 1000;
    // Jede Sekunde wachen wir auf und machen ein Resend um sicherzugehen, dass das Paket ankommt
    transmitter.resend((byte *)msg, strlen(msg) + 1);
  }

  // ... restlicher Code ...
}

Also grundsätzlich gibt es keinen Konflikt mit delay(). Wenn man sich schlafen legt, passiert im Hintergrund nichts. Man muss regelmäßig aufwachen und nachhelfen.

Gruß

Andreas

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants