Forum: Mikrocontroller und Digitale Elektronik ATmega16 - UART get string


von Norbert L. (hysteria1212)


Angehängte Dateien:

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

von Lupin (Gast)


Lesenswert?

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

von Norbert L. (hysteria1212)


Lesenswert?

@Lupin

Erstmal danke.

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

von Karl H. (kbuchegg)


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.

von Lupin (Gast)


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).

von Norbert L. (hysteria1212)


Lesenswert?

Danke an alle.

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

von Norbert L. (hysteria1212)


Lesenswert?

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

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.