mikrocontroller.net

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


Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

hat jemand eine Routine, die eine Zeichenkette einliest?

Danke für Antwort

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich habe drei Routinen.

Autor: ::: (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab auch eine... Gewoehnlch macht man das mit Zustandsmaschinen.

Autor: gast (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interupt

Autor: Timo P. (latissimo)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Timo P. (latissimo)
Datum:

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

Autor: Timo P. (latissimo)
Datum:

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

Autor: holger (Gast)
Datum:

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

Dann machs halt später.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  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
   irgendein_typ Array[n]

ist das Element
   Array[ sizeof( irgendein_typ ) / sizeof( *irgendein_typ) ]

nicht existent.

Autor: Timo P. (latissimo)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.