Senderfunktion mit beliebiger Anzahl an Empfängern

Hallo,

ich benötige eine Funktion, die einen ihr zu übergebenden Wert "x" an Empfänger sendet.

Ich möchte nun erreichen, dass ich der Funktion nicht nur den zu sendenden Wert übergebe, sondern ich möchte mit dieser Funktion diesen Wert gleich an eine beliebige Anzahl von Empfängern senden.

Hier ein Pseudocode, wie ich mir das in der Theorie vorstelle:

Die Empfänger mit den IDs 4, 66 und 241 sollen den Wert 273567 erhalten.

sendFunction(273567, 4, 66, 241);

Nur der Empfänger mit der ID 2 soll den Wert 823 erhalten.

sendFunction(823, 2);

Da ich nur Werteübergaben an Funktionen mit einer festen, vorher zu definierenden Anzahl an Werten kenne, weiss ich nicht, wie ich die gewünschte Flexibilität erreichen kann ohne die Funktion mehrfach aufrufen zu müssen. Geht das überhaupt, oder löst man das anders?

Gruß Chris

PS: Ich gehe von max. 256 unterschiedlichen Empfänger-IDs aus.

hi,

die IDs der empfänger verwirren mich ein wenig, hast Du wirklich 241 oder mehr davon?

bei bis zu 8 empfängern geht das am schönsten, wenn man in einem gesendeten byte die entsprechenden bits setzt, also zb.:

10010011 = 147 für die empfänger 8, 5, 2 und 1

wenn der empfänger weiß, er ist nummer 5, dann verknüpft er den empfangenen wert mit einem bitweisen UND mit 5.

hast Du schon mal darüber nachgedacht, ob Du eine adressierung brauchst? oft ist es besser, wenn einfach alle zuhören und jeder weiß, für welche funktion er zuständig ist...

gruß stefan

Für sowas gibt es variadische Funktionen. Schon seit C Zeiten. Siehe printf() wo man eine beliebige Anzahl an Parametern übergeben kann

void func(unsigned long value, unsigned int count, ...)
{
  va_list ap;
  va_start(ap, count);

  for (unsigned int i = 0; i < count; i++) 
  {
    Serial.println(va_arg(ap, unsigned int));
  }
  va_end(ap);

  Serial.println();
}


void setup()
{
  Serial.begin(9600);

  func(100, 3, 1, 2, 3);
  func(100, 5, 1, 2, 3, 4, 5);
  func(100, 1, 1);
}

void loop()
{
}

Man muss aber die Anzahl der Parameter angeben

Oder schöner in C++11 mit einem variadischen Template. Dann muss man nicht die Anzahl der Parameter übergeben:

void func(unsigned long value)
{
  Serial.println();
}

template<typename T, typename... Args>
void func(unsigned long value, T arg, Args... args)
{
  Serial.println(arg);
  func(value, args...);
}


void setup()
{
  Serial.begin(9600);

  func(100, 1, 2, 3);
  func(100, 1, 2, 3, 4, 5);
  func(100, 1);
}

void loop()
{
}

Das Template ist rekursiv. Die Funktion ohne ... wird am Ende gebraucht wenn die Liste leer ist. Davor wird bei jedem Aufruf ein Parameter aus der Liste entfernt.
Das ist aber Template-typisch nur im Code so. Praktisch ist das nicht rekursiv!

Der Nachteil der Template Variante ist dass für jede Aufruf-Kombination eine eigene Funktion erzeugt wird. Je nachdem wie man das verwendet belegen Templates also mehr Flash Speicher. Eine variadische Funktion wird dagegen zur Laufzeit ausgewertet. Der Nachteil ist die fehlende Typ-Sicherheit, was aber hier keine Rolle spielt (was man als Parameter übergibt kann irgendwas sein, aber wird einfach als Integer angenommen).

Das gibt's doch nicht.. hast Du das mal kurz aus dem Kopf getippt?

Gruß Chris

Der Mann kennt die Sprache, welche er verwendet.

Wikipedia hilft :stuck_out_tongue:

Ich hatte das hier schon ein oder zwei mal gezeigt. Wenn man was man grob tun muss, kann man die Details dann auf vielen Seiten nachschlagen

Die Empfänger mit den IDs 4, 66 und 241 sollen den Wert 273567 erhalten.

Kannst du das nicht anders rum angehen?

Beispiel:
Du erfindest Ereignisse.
Und alle Empfänger prüfen, ob sie auf das Ereignis reagieren müssen.

Hallo,
"Das gibt's doch nicht.. hast Du das mal kurz aus dem Kopf getippt?"

Das traue ich Ihm ohne weiteres zu…

"Der Mann kennt die Sprache, welche er verwendet."

Ja, leider. Turmbau zu Babel- er ist der einzige, der die Sprache versteht.

Das aber nur am Rande…

"Ich gehe von max. 256 unterschiedlichen Empfänger-IDs aus"

Da würde ich nicht mit Software rumhampeln. Baue Dir ein XBee-Netzwerk auf.
Die verstehen sich fast von alleine.
Gruß und Spaß
Andreas