Forum: Mikrocontroller und Digitale Elektronik Array nach passenden Codes durchsuchen


von TOM (Gast)


Lesenswert?

Hallo Zusammen,

ich möche mit einem MEGA128 ein Transponder System fernsteuertn bzw per 
MC steuern.
Ich habe mir folgendes gedacht.
Der MC soll das Transpondersystem selbständig abfragen nur ab und an für 
Testzwecke oder Änderungen verschiedener Variablen möchte ich das System 
auch per Commando per PC steuern.
Ich habe mir gedacht ich speichere alle Steuerbefehle in ein Array wird 
nun ein Steuerbefehl empfangen durchsucht er das Array nach diesem 
Befehl wenn er ihn findet führt er dann etwas bestimmtes aus.
Nur habe ich keinen Ansatz wie ich das Array am besten durchsuchen soll.
Eigenlich wollte ich zuerst die erste Spalte durchsuchen wird dann etwas 
passendes gefunden dann die gleiche Zeile jedoch die nächste Spalte 
stimmt dies dann nicht weiter die erste spalte durchsuchen usw.
Jedoch wie kann ich sowas programmieren?

Ich programmiere mit AVR Studio AVR GCC.

Gruss

TOM

von F. K. (freddy436)


Lesenswert?

hmm, bin mir nicht sicher ob ich dich richtig verstanden habe.

Tuts eventuell ein switch(command) und dann eventuelle "sub" 
switch()'es?

Ein paar mehr Details über das Protokoll wären interessant.

von Alexander L. (lippi2000)


Lesenswert?

Also du willst meinetwegen 5 Bewehle o.Kommandos in der 1.Spalte und 5 
Zeilen ablegen. Wird ein Kommando empfangen, so werden nacheinander alle 
Werte der 5 Zeilen in Spalte 1 verglichen. Enthält eine Zeile den Wert, 
soll ein anderes Kommando ausgeführt werden was dann in der gleichen 
Zeile eine Spalte weiter steht???

Hab lange kein C gemacht. Aber was du brauchst ist vielleicht so etwas:

int  A[6,6];                 //Array 6x6 Felder
int  Befehl;                 //Empfangener Befehl
int  i,j;                    //Zählvariablen

i=0;                    //Spalte auf Null wenn nichts gefunden wird
                       //steht dieser Wert immer noch auf Null
for(j=1;j=5;j++)
   {                     //Beginn in Spalte 0
    if( A[i,j]==Befehl;      //Befehl gefunden?
       then
           {for(i=1;i=5;i++) //Alle 5 Werte dieser Spalte werden durchl.
               {..........
                ..........
               }
           }
   }                         //nächste Spalte vergleichen

Ist das Programm beendet und i steht immer noch auf 0, so wurde kein 
Befehl gefunden.

von Thomas S. (thomass)


Lesenswert?

@ all,

bin leider erst heute wieder dazu gekommen etwas weiter zu machen.

@Alexander

Dein Vorschlag sieht zwar gut aus jedoch gibt es THEN in c nicht 
wahrscheinlich jedoch in c++.

Zu meinem Protokoll.

es werden 12 Hexwerte übertragen.

Nun stehen in einem Array ebenfalls Referenzwerte also 12 Werte und das 
ganze x Mal.

Nun soll der erste Hexwert mit der ersten Spalte des Arrays überprüft 
werden wird der gleiche Wert z.B. in der Zeile 6 gefunden soll die 
zweite Spalte dieser Reihe mit dem zweiten Hexwert verglichen werden 
wenn der auch stimmt die 3 Spalte mit dem 3 Hexwert usw bis zum 12 
Hexwert.
Ist jedoch ein Hexwert falsch soll die erste Spalte des Arrays nach dem 
1 Hexwert weiter durchsucht werden.

Wird ein passender Datensatz(12 Hexwerte) ermittelt soll etwas gemacht 
werden wenn nicht gibt es eine Fehlermeldung.

Danke schon mal


Thomas

von TheMason (Gast)


Lesenswert?

@stricker

ich habe einen parser geschrieben, der allerdings nicht ganz einfach (zu 
verstehen) ist, aber dafür einiges an möglichkeiten bietet. leider ist 
der nicht für den avr geschrieben (problematik das zeiger nicht 
transparent auf RAM oder Flash zeigen können)
schau mal in der codesammlung unter "uShell - unvierseller Parser für 
uC's".
falls interesse besteht (und etwas wartezeit in keuf genommen wird :-) 
mache ich noch eine anpassung für die avr's.

das funktionsprinzip (so wie ich es deiner erklärung nach verstande 
habe) ist dort auch nochmal ausführlich erklärt

gruß
rene

von F. K. (freddy436)


Lesenswert?

Dann brauchst du im wesentlichen zwei verschachtelte Schleifen.
Die erste Schleife geht durch jede Zeile, die zweite vergleicht dann die 
jeweiligen spalten der Zeile.

Hier mal ein grobes Standrad C code Beispiel:
1
unsigned char array[rows][12]; // die "tabelle"
2
unsigned char data[12]; // die zu vergleichenden werte
3
4
int row, column;
5
unsigned char found = 0;
6
for(row=0; row < rows; ++row) // alle zeilen prüfen
7
{
8
  for(column=0; column < 12; ++column) // alle spalten prüfen
9
  {
10
    if(array[row][column] != data[column]) // werte stimmen nicht überein
11
    {
12
      break; // spalten schleife verlassen (mit der nächsten Zeile weitermachen)
13
    }
14
    else if(column == 11) // werte stimmen überein (else if) + letzte spalten
15
    {
16
      found = 1; // gefunden!
17
      break; // spalten schleife verlassen
18
    }
19
  }
20
  if(found) // wenn gefunden)
21
  {
22
    break; // Zeilen Schleifen verlassen
23
  }
24
}

Das array packst du aber am besten fest in den flash rein.

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
Noch kein Account? Hier anmelden.