Hi,
ich möchte mehrere Komponenten am mein Mikrocontrollersystem über UART
anbinden. Die Komponenten melden sich über eine ID an. Diese ID lege ich
in einem Arrayfeld ab. Später kann ich mich durch drücken eines Tasters
mit dem gewünschten Modell verbinden.
Im Moment mache ich das so:
if((Kennung[0] == 0))
{
Kennung[0] = ID;
}
if(!(ID == Kennung[0]))
{
Kennung[1] = ID;
}
if((!(ID == Kennung[0])) && (!(ID == Kennung[1])))
{
Kennung[2] = ID;
}
usw.
Bei drei bis vier Komponenten auch nicht so das Problem. Wenn es aber
mal 20 werden sollen, gibt das schon eine Menge Code und der Part frisst
ganz schön viel Speicher.
Kann man das vielleicht irgendwie eleganter lösen?
Hi,
Vielleicht solltest du das mit einer einfachen While-Konstruktion
erledigen :
i = 0;
while(Kennung[i]!=0)
i++;
Kennung[i] = ID;
nur so eine Idee, aber sollte funktionieren
Wäre es möglich etwas mehr über dein Protokoll zu erfahren?
>Im Moment mache ich das so:>if((Kennung[0] == 0))>{> Kennung[0] = ID;>>}>>if(!(ID == Kennung[0]))>{> Kennung[1] = ID;>>}>>if((!(ID == Kennung[0])) && (!(ID == Kennung[1])))>{> Kennung[2] = ID;>>}>>usw.
Soll man daran irgendein Schema erkennen können?
>i = 0;>>while(Kennung[i]!=0)>{> i++;> Kennung[i] = ID;>}
So würde ich das auch in etwa verstehen...
So eine Aufgabe wird gerne mit verketteten Listen (linked lists)
erledigt.
http://de.wikipedia.org/wiki/Liste_(Datenstruktur)http://www.pronix.de/pronix-827.html
Es gibt dann Listenelemente (mit der ID ggf. weiteren Nutzdaten und
einem Zeiger zum nächsten Listenelement) sowie Funktionen zum Anlegen,
Löschen und Suchen eines Listenelements.
In Sonderformen werden doppelt verkettete Listen verwendet, die ausser
dem nächsten Element auch auf das vorhergehende Element verweisen.
Manchmal gibt es in der Library der verwendeten Programmiersprache schon
Unterschützung für solche Listen. Bei C++ wäre sicher sowas dabei, bei C
für µC ist eher Selberschreiben angesagt.
gedacht?
das ganze in 'ne Schleife um alle IDs abzuarbeiten (bei den Cases NUR
die eintragen, die es auch gibt). und dei switch -konstruktion unbedingt
in einem buch nachschlagen :) die ist so wahrscheinlich nicht korrekt
> if((Kennung[0] == 0))> {> Kennung[0] = ID;>> }>> if(!(ID == Kennung[0]))> {> Kennung[1] = ID;>> }>> if((!(ID == Kennung[0])) && (!(ID == Kennung[1])))> {> Kennung[2] = ID;>> }>
Ich versuch das nochmal zu interpretieren :
Für mich sieh das so aus, dass versucht wird, die nächste freie ID zu
finden.
>i = 0;>>while(Kennung[i]!=0)>{> i++;> Kennung[i] = ID;>}
Vorsicht ! hier würdest du dir auch alle ID's überschreiben, da das oben
nicht gleich dem ist :
>i = 0;>>while(Kennung[i]!=0)> i++;>Kennung[i] = ID;
Hier wird wirklich die nächste "freie ID" gesucht.
>Für mich sieh das so aus, dass versucht wird, die nächste freie ID zu>finden.
Das wird es sein...
>Vorsicht ! hier würdest du dir auch alle ID's überschreiben, da das oben>nicht gleich dem ist :
Meine Raterei halt...
Hey, erst einmal Danke!
>Wäre es möglich etwas mehr über dein Protokoll zu erfahren?
Klar, also ich möchte möchte mehrere mikrocontrollerbasierte
Geräte/Komponenten(Modellautos, Beleuchtung einer Eisenbahnanlage,
LCD-Anzeigen usw.) mit Bluetooth ausstatten. Diese melden sich nach dem
Einschalten an einen Controllpult, Terminal oder Fernbedienung an und
vereinbaren eine zufällige ID.
Sobald diese ausgetauscht ist, wird das angemeldete Gerät auf diese ID
gesetzt und wartet. Am Controllpult wird diese in einem Feld des Array's
gespeichert. Nun möchte ich durch drücken eines Tasters durch die
verschiedenen Komponenten zappen, also durch das Array um die
entsprechenden Geräte zu steuern.
Diese Methode:
>i = 0;>>while(Kennung[i]!=0)>{> i++;> Kennung[i] = ID;>}
würde nicht funktionieren.
Diese Methode
>i = 0;>>while(Kennung[i]!=0)> i++;>Kennung[i] = ID;
ist schon besser, jedoch reicht es ja nicht aus nur auf ungleich Null zu
vergleichen. Wenn ich zwischendurch auf die ID wechsel, die schon
abgespeichert ist, wird sie erneut in ein Feld geschrieben und ist somit
doppelt vorhanden.
>Für mich sieh das so aus, dass versucht wird, die nächste freie ID zu>finden.
Nicht nur, es soll die ausgehandelte ID, die noch nicht vorhanden ist in
das nächste freie Feld geschrieben werden. Also keine doppelten
Belegungen.
Gruß
for(i=0;i<maxI;i++)
{
if (Kennung[i]==ID)) break; // Schleife verlassen, wenn ID schon im
Feld vorhanden ist
if (Kennung[i]==0) // bei erstem Auftreten eines leeren Eintrages ID
hinzufügen und Schleife verlassen
{
Kennung[i]=ID;
break;
}
}
Super! Danke,
so etwas hab ich gesucht. Ist es möglich in der for_Schleife ne doppelte
Bedingung mit einzubringen?
Etwa wie
for(i=0; i<maxI && a==1; i++)
Frank wrote:
> so etwas hab ich gesucht. Ist es möglich in der for_Schleife ne doppelte> Bedingung mit einzubringen?
ja ist es, macht man aber eher selten. Setze lieber in die Schleife noch
ein if für die entsprechende Bedingung, falls die Schleife abgebrochen
werden soll einfach "break;" aufrufen, damit verlässt man schleifen.
Eventuell könnte auch "continue;" interessant sein (springt zum nächsten
Schleifen Durchgang).
>Mein alter C Pauker würde mich lünchen, wenn ich aus einer>for/While-Schleife mit einem break; rausspringen würde ;)
Niemand hat etwas von einem Schönheitspreis erwähnt, und dass es die
einzig mögliche Lösung ist...
@Stefan Lücke
>Mein alter C Pauker würde mich lünchen, wenn ich aus einer>for/While-Schleife mit einem break; rausspringen würde ;)
Warum? C ist ja nicht gerade das Parade beispiel für eine strukturierte,
möglichst wasserdichte Programmiersprache.
MfG
Falk
Ich hab ja nicht gesagt, dass ich sowas nicht auch öfter mal nutze und
teilweise sogar sinnvoll finde. Aber er war ein verfechter des, wie er
immergesagt hat "sauberen und struktorierten" programmierens.
Naja ... er hat auch bis zum Schluss geglaubt, dass ich meine
Struktugramme immer vorher gemacht hab =)
War auch Off-Topic, von daher : Sorry das ich jetzt hier sowas
losgetreten hab.