www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stringvergleich


Autor: Patric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: Patric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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......

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Patric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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].

Autor: Patric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:-)

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
   }
}

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patric (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Patric (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.