Forum: Mikrocontroller und Digitale Elektronik interruptgesteuerte UART, string empfangen ATMEGA


von Timo P. (latissimo)


Lesenswert?

Hallo!

hat jemand eine Routine, die eine Zeichenkette einliest?

Danke für Antwort

von gast (Gast)


Lesenswert?

Ja, ich habe drei Routinen.

von ::: (Gast)


Lesenswert?

Ich hab auch eine... Gewoehnlch macht man das mit Zustandsmaschinen.

von gast (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

Siehe Interupt

von Timo P. (latissimo)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Timo P. (latissimo)


Lesenswert?

sitze grade an einem fremden rechner ohne compiler, ohne 
entwicklungsumgebung :(
also nix probieren....

von Timo P. (latissimo)


Lesenswert?

wenn ich i im main auf 0 setzte, hast du recht...

von holger (Gast)


Lesenswert?

>sitze grade an einem fremden rechner ohne compiler, ohne
>entwicklungsumgebung :(
>also nix probieren....

Dann machs halt später.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Timo P. (latissimo)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.