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
hast ja nur die rom file mitgschickt! könnte es vielleicht am lokalen echo liegen? kann man beim terminal programm einstellen.
ach sorry, hier also das C file:-) Ne es liegt nicht am lokalen echo, das ist aus, und er sendets erst aut schalterbetätigung......
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!
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?
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].
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:-)
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
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 } }
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.
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...
Du darfst die 10 und 13 nicht in Hochkommas schreiben! \n funzt schon, das muss dann aber in Hochkommas stehen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.