Forum: Mikrocontroller und Digitale Elektronik Stringvergleich


von Patric (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich würde gerne die über UART empfangenen Zeichen vergleichen und wenn 
sie übereinstimmen ein Befehl wider über die UART ausgeben. Leider funzt 
das nicht richtig. Wenn ich zum Beispiel über die PC-tastatur irgendwas 
zum uC sende, bekomme ich diese Zeichen wieder zurück geschickt, obwohl 
ich sie nirgens zum zurücksenden übergebe. Sieht jemand den Bock im 
Code?

Danke und readU Patric

von Jonas Diemer (Gast)


Lesenswert?

hast ja nur die rom file mitgschickt! könnte es vielleicht am lokalen 
echo liegen? kann man beim terminal programm einstellen.

von Patric (Gast)


Angehängte Dateien:

Lesenswert?

ach sorry, hier also das C file:-)

Ne es liegt nicht am lokalen echo, das ist aus, und er sendets erst aut 
schalterbetätigung......

von Jonas Diemer (Gast)


Lesenswert?

also als erstes fällt auf, dass empfang und i (die globalen variablen, 
die im interrupt geändert werden) also volatile deklariert sein müssen!

von Patric (Gast)


Angehängte Dateien:

Lesenswert?

hab mal ein paar variabeln als volantile deklariert, funzt aber immer 
noch nicht richtig.
Bei diesem Code habe ich durch Tests folgendes fest gestellt.
- Betätige ich den Schalter nach sendet er: at+cmgr=1 (ohne das ich 
zuvor etwas gesendet habe
- Sende ich mehr als 13 Zeichen, werden die Zeichen 14 bis 26 bei 
Schalterbetätigung an den PC gesendet
Es sieht aus, als überschreibe man fremde Variabel, bzw. speicherplätze, 
wie unterbinde ich das?

von Jonas Diemer (Gast)


Lesenswert?

ohwei, empfang ist ja nur als zeiger deklariert!!!

char empfang[] ist gleichwertig mit char *empfang!!!

entweder du allozierst nun speicher und weist den zu, oder du gibst die 
größe des arrays beim deklarieren an:

char empfang[30].

von Patric (Gast)


Lesenswert?

Danke!
Obwohl ich die Fachbegriffe nicht ganz begriffen habe, siehts nun besser 
aus, d.h. er vergleicht die Strings nun. Aber ich krige das OK irgendwie 
nicht in den empfang String:-)

von peter (Gast)


Lesenswert?

Hi Patric,

wenn du nur einen Pin eines Ports abfragen willst, solltest du das auch 
machen und nicht das ganze Byte testen. Vielleicht willst die anderen 
Bits ja später mal für Erweiterungen nutzen und dann suchst Du wieder 
Fehler.

Nimm also "if ( !(inp(PINA)&1) )" um ein Bit auf 0 zu testen
und "if (inp(PINA)&1)" um ein Bit auf 1 zu testen.

Deine Abfragen für "Schalter ist high" und "Schalter ist low" sind 
übrigens identisch, ist wohl schonmal ein Fehler. (Bei der if und der 
while Bedingung)

Dann würde ich ok in der Schleife auf 0 setzen, am besten vor der 
Schleife wo du die Anzahl der gleichen Zeichen zählst.

Peter

von peter (Gast)


Lesenswert?

in der Endlosschleife,

also

while(1)
{
   if (!(inp(PINA)&1)))
   {
       ok=0;
       for(z=0;z<13;z++)
      {
          if(text[z] == empfang[z])
          {
             ok++;
          }
      }

...


   while(inp(PINA)&1);  // warten auf high
   }
}

von Jonas Diemer (Gast)


Lesenswert?

statt dem inp-kram kannste auch machen:

if (bit_is_set(PORTn,BITNR))

bzw. bit_is_clear...

is im prinzip dasselbe, sieht nur besser aus.

von Patric (Gast)


Lesenswert?

Danke Jungs für die Tipps. Es funzt nun, wenn ich es mit dem PC Teste. 
Das Problem ist nun, dass das GMS Modul, das ich ansteuern will, zuerst 
ein Enter sendet und erst dann +CMTI: "SM". Deshalb habe ich gedacht 
nehme ich dies auch noch in die Vergleichsvariabel:

 volatile static char text[12] 
={'10','13','+','C','M','T','I',':','"','S','M','"'};

er gibt mir aber beim Compilieren ein paar warnungen aus, wie:
multi-character char constant  oder overflow in implicitconstant 
conversion

Wie gib ich das am besten ein?
\n funzt nicht...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du darfst die 10 und 13 nicht in Hochkommas schreiben!
\n funzt schon, das muss dann aber in Hochkommas stehen.

von Patric (Gast)


Lesenswert?

Thanks! die warnungen sind nicht mehr da:-)
Beim vergleich habe ich nun einfach die ersten zwei zeichen ausgelassen, 
dan funzt es....

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.