www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega16 - UART get string


Autor: Norbert Link (hysteria1212)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

wie im anhang zu sehen ist, versuche ich gerade über ne for-schleife
zeichen, die ich über den uart empfange, in einen String zu speichern
um diesen später komplett zurückzusenden.(habe bewusst nicht auf
vorgefertigte c-funktionen zurückgegriffen) nun, die uart-kommunikation
von uC zum PC und umgekehrt klappt, auch die im code enthaltene
sendefunktion funzt so wie sie soll.
das was der code nun macht, er scheint die zeichen zu empfangen gibt
dann aber lediglich das (glaube ich) letzte zeichen 15x zurück.




dank euch

p.s. wie am programmierstil bestimmt zu erkennen ist, bin ich noch
etwas jungfrau was das programmieren angeht ;), also habt erbarmen

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for(;;)
{
    test[0]=EmpfangByte();
    SendenByte(test[0]);
}

Autor: Norbert Link (hysteria1212)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lupin

Erstmal danke.

aber funktioniert die Routine nicht nur mit einem Zeichen?
Sprich, so wie SendenByte(EmpfangByte() ); (Echo)

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

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir doch noch mal die Sendeschleife in main()
durch:

  for (i=0;i<=14;i++)
  {
    test[i]=EmpfangByte();
  }

                 //String senden

  for (j=0;j<=14;j++)                  //klappt auf jeden Fall
  {
    UDR=test[j];
    SendenByte(UDR);
  }

UDR ist bereits das UART Register. Wenn Du dort was hineinschreibst
wird es gesendet, wenn Du von dort liest wird das zuletzt
empfangene Zeichen geliefert. Also: Warum weist Du UDR in dieser
Schleife direkt was zu? Senden ist doch Aufagbe der Funktion
SendenByte. Und was willst Du senden. Na ja, das Zeichen das in
test[j] steht, wobei j von 0 bis 14 laeuft. Also muss es heissen

   for( j = 0; j <= 14; j++ )
   {
     SendenByte( test[j] );
   }

PS: Gewoehn dir an, in for Schleifen nach Moeglichkeit die
Abfragebedingung mit < zu formulieren und nicht mit <=

   for( j = 0; j < 15; j++ )

Die Schleife wird 15-mal durchlaufen und als geuebter C Programmerier
sieht man das dann auch mit einem Blick.

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochwas: solange du in der SendenByte() schleife hängst kannst du auch
keine bytes empfangen ich glaube ein AVR hat keine UART FIFOs - d.h.
die daten die während dieser Zeit empfangen werden sind verloren (nur
das letzte byte bleibt dann im UDR register stehen).

Autor: Norbert Link (hysteria1212)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle.

@Lupin. Das wird dann auch der Grund für mein Problem sein...

Autor: Norbert Link (hysteria1212)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@kbuchegg
mmh. Klasse Sache, dein Tipp hat geholfen, bin mir sicher ich hatte es
so schonma. Nochmals danke.

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.