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.
Mal an
1 | ... |
2 | switch kennung[i]: |
3 | |
4 | case 1: |
5 | ... |
6 | break; |
7 | |
8 | case 2: |
9 | ... |
10 | break; |
11 | |
12 | //etc.... |
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 ;)
>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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.