Hallo! hat jemand eine Routine, die eine Zeichenkette einliest? Danke für Antwort
Ich hab auch eine... Gewoehnlch macht man das mit Zustandsmaschinen.
ich hab auch eine :) ansonst nimm die fleury lib und rufe solange getchar auf bis du ein stringendezeichen empfängst dann is dein string da und du kannst ihn verarbeiten ansonst die ISR etwas bearbeiten und einen buffer anlegen wo der längste string der vorkommen kann reinpasst wenn ein zeichen kommt gucken ob es das endezeichen ost und buffer füllen wenn endezeichen da, bearbeitung
legt einer von euch den code offen? geht folgendes: ISR(USART0_RXC_vect) { if (i <= sizeof(Buffer)) { Buffer[i] = UDR; i++; } else //hier Flag setzen, dass gewünschte stringlänge empfangen ist } dann im mainprogramm beim gesetzten flag i und flag auf 0 setzen
Timo P. schrieb: > legt einer von euch den code offen? > > geht folgendes: Probiers aus. Du kannst dabei nur lernen. Wenn es nicht funktioniert, ist nicht viel kaputt. Wenn es funktioniert, dann hast du das befriedigende Gefühl, etwas verstanden zu haben. Und ja: Misserfolg ist Teil des Lernprozesses. > > > ISR(USART0_RXC_vect) > { > if (i <= sizeof(Buffer)) Das kleiner-gleich ist Unsinn. Es muss kleiner heißen. In C wird bei 0 angefangen zu zählen.
sitze grade an einem fremden rechner ohne compiler, ohne entwicklungsumgebung :( also nix probieren....
wenn ich i im main auf 0 setzte, hast du recht...
>sitze grade an einem fremden rechner ohne compiler, ohne >entwicklungsumgebung :( >also nix probieren.... Dann machs halt später.
Timo P. schrieb:
> wenn ich i im main auf 0 setzte, hast du recht...
Nicht nur dann.
Auch wenn du i in main auf 356 setzt, muss es immer noch 'kleiner'
heißen.
In C wird bei 0 angefangen zu zählen. Das hat Auswirkungen.
zb hat ein Array welches auf 8 Elemente dimensioniert wird
1 | char Buffer[8]; |
und daher einen sizeof von 8 hat, immer noch die Elementindizes 0, 1, 2, 3, 4, 5, 6, 7 zähl nach. Sind genau 8 Stück. Der größte gültige Index in ein Array ist immer um 1 kleiner als Anzahl der Elemente im Array. Wenn dein i daher sizeof erreicht hat, ist es nicht mehr zulässig einen Wert im Array zu speichern. Das entsprechende Arrayelement existiert schlicht und ergreifend nicht. In einem
1 | irgendein_typ Array[n] |
ist das Element
1 | Array[ sizeof( irgendein_typ ) / sizeof( *irgendein_typ) ] |
nicht existent.
Wenn ich strings empfangen möchte, muss ich wohl entweder die Stringlänge kennen oder ein stringende-Zeichen benutzen. Irgendwo auf Mikrocontroller.net habe ich sowohl \0 für einen standard C-string als auch \n gefunden. Jetzt bin ich verwirrt! Prinzipiell ist es doch egal, welches Zeichen ich verwende oder? Lediglich der Vergleich von strings zb via: strcmp(Buffer,"send values") was genau müsste dann in Buffer drin stehen, damit strcmp eine 0 zurückgibt? wenn ich in C "send values" schreibe, dann ist das doch ein string mit \0 oder nicht? wenn also in Buffer nur "send values" steht und es mit "send values" verglichen wird, ist eine Äquivalens wann gegeben? mit oder ohne stringendezeichen in Buffer?
Du empfängst keinen String. Du empfängst Zeichen. Punkt Diese Zeichen sammelst du ein einem char-Array. Auf irgendeine Weise (zb indem dir der Sender vorab die Anzahl der Zeichen geschickt hat oder indem er ein '\n' schickt) weißt du, dass nach dem Empfang eines Zeichens die Übertragung von Zeichen abgeschlossen ist und die Summe all dieser Zeichen als String zu werten ist. Damit aus einer Sequenz von Zeichen in C ein String wird, muss hinten an die Zeichen ein '\0' Character drann. Ab diesem Zeitpunkt hast du in deinem char-Array einen gültigen C-String, den du mit den C-Standard str... Funktionen bearbeiten kannst.
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.