Das Problem ist, dass Strings keinen eigenen Datentypen sind. Strings sind arrays. Deswegen kann man sie auch nciht direkt aneinander hängen.
Da gibt es spezielle Funktionen. Musste mal nach suchen in der Doku.
Andun
Hi,
ich will, dass mein PC mit dem AVR über UART kommunizieren kann. Erstmal soll der Controller nur Befehle empfangen können, später Daten zurücksenden.
Wenigstens kann ich schon mal interruptgesteuert Zeichen vom UART lesen. Das ist ja schon mal was. Aber jetzt kommen wieder C Basics ins Spiel. Ich warte jetzt auf ein Startzeichen und hänge dann alle empfangenen Zeichen aneinander, bis das Stopzeichen kommt. Dann soll das bis jetzt Empfangene ausgewertet werden.
1. Frage:
Wie hänge ich ein char an einen String? Das ganze soll auch in der Länge variabel sein.
2. Frage:
Wie vergleiche ich 2 chars?
if(c == 't') funktioniert ja nicht. Da kommt immer die Meldung, dass das immer false ist aus irgendeinem bescheuerten Grund.
C ist schon seltsam.
mfg
jagdfalke
Das Problem ist, dass Strings keinen eigenen Datentypen sind. Strings sind arrays. Deswegen kann man sie auch nciht direkt aneinander hängen.
Da gibt es spezielle Funktionen. Musste mal nach suchen in der Doku.
Andun
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Und was hälst Du von einem Puffer im RAM z.B. 10 Bytes,
dort verschiebst Du Deine empfangenen Zeichen hin, bis ein Stop Zeichen kommt.
Dann kannst Du alles mit weiß was ich was vergleichen, ohne chars an Strings anhängen zu müssen.
C ist nicht seltsam, sondern Deine Denkweise ist seltsam.
Gruß Sebastian
Moin!
Ein String ist ein Array of Char.
Es gibt zwei Möglichkeiten dein Problem zu lösen.
Die Primitive:
Man kann sich anfangs einen Buffer erzeugen (volatile char ca_x[20], mit der maximalen Nachrichtengrösse, dazu einen volatile char counter, der bei jedem empfangenen Zeichen hochgezählt wird und als Index für das Array genutzt wird.
Interrupt:
counter++;
ca_x[counter]=Zeichen vom UART;
Eleganter dürfte die Variante mit Pointern sein, aber auch da wird der Pointer im Interrupt hochgesetzt. Und dann an die Stelle auf die der Pointer zeigt das Zeichen geschrieben.
Zum Problem mit dem char Vergleich:
Eigentlich müsste es gehen. (Bei mir geht es, aber ich nutze auch einen Fujitsu Microcotroller & Workbench)
Man könnte das Problem umgehen, in dem man die Zeichen nach dem Ascii Code zu Zahlen umwandelt. Also nicht uc=='a' sondern uc==0x61 oder uc==97.
eine empfehlenswerte Seite:
http://www.pronix.de/pronix-735.html
MfG Argentan
Umfangreiche String-Funktionen findest Du in der string.h (liegt in avr\include). Wenn Du viel mit Strings arbeitest, kommst Du an ihr nicht vorbei.
Dort findest Du z.B. Funktionen zum Vergleichen von Strings (strcmp), zum ermitteln der Länge von Strings oder zum kombinieren von Strings. Beschrieben sind die Funktionen im libc manual.
Wenn Du Fragen dazu hast, melde Dich, ich kenne die string.h eigentlich recht gut...
askazo
Incrementieren eher nachher, denk ich, was steht den dann auf ca_x[0] ?Zitat von argentan
Das ist für C Jacke wie Hose. Vergeßt aber nicht die Klein/GroßschreibungZitat von argentan
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
also z.B. so ?
mfgCode:char readChar(void); char str* = ""; SIGNAL(SIG_USART_RECV) { s = readChar(): s++; }
jagdfalke
So etwa haltCode:char readChar(void); char Instring[MAX_CHAR]; char InIdx = 0; SIGNAL(SIG_USART_RECV) { Instring[InIdx] = readChar(); switch (Instring[InIdx]) { case ENTER: // ev. signalisieren an "Main()" Instring[InIdx] = 0; // korr. Stringterminator to \0 break; case START: // Startzeichen ?? InIdx = 0; break; default: InIdx++; break; } if (InIdx > MAX_CHAR) { overflow, was machen wir ? } }
Nicht berücksichtigt sind falsche Zeichen, CAN od. Delete usw. und ECHO, wenn es eine Tastatureingabe ist
Die Auswertung ist Case-Sensitiv, muß man aufpassen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
START und ENTER sind hier char-Variablen, die die Start- bzw Stoppzeichen enthalten oder? Ok, habs gecheckt.
Das wäre dann die Methode mit begrenzter Länge. Und wie geht das mit diesem Pointer-Ding?
mfg
jagdfalke
Pointer oder Index läuft auf das gleiche raus. Index is ein Pointer ab feldanfang, Pointer ab Speicheranfang. Ich würde mich entscheiden, je nachdem WO und WIE ich im restlichen Programm die Daten brauch oder hab'.
Code:char readChar(void); char Instring[MAX_CHAR]; char* InPnt = (char*)&Instring[0]; // ich geh gern auf Nr.Sicher und caste SIGNAL(SIG_USART_RECV) { *InPnt = readChar(); switch (*InPnt) { case ENTER: // ev. signalisieren an "Main()" *InPnt = 0; break; case START: // Startzeichen ?? InPnt = (char*)&Instring[0]; break; default: InPnt++; break; } }
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen