Vereinfachung?

Gast #507859
Lesenswert?
• ▲
▼
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?
#507867
Lesenswert?
• ▲
▼
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...

Gast #507874
Lesenswert?
• ▲
▼
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.
Gast #507875
Lesenswert?
• ▲
▼
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
#507917
Lesenswert?
• ▲
▼
> 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.

Gast #508021
Lesenswert?
• ▲
▼
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ß

#508111
Lesenswert?
• ▲
▼
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).
Gast #508138
Lesenswert?
• ▲
▼
@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
#508142
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.