www.mikrocontroller.net

Forum: Compiler & IDEs Frage zum Empfang von Zeichenketten über UART


Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes habe ich im AVR-GCC-Tutorial gefunden:
/* Zeichen empfangen */
uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}
 
void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;
 
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
 
                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen kam
                                  // * oder das aufnehmende Array voll ist
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
  }
 
                                  // Noch ein '\0' anhängen um einen Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}
  char Line[40];      // String mit maximal 39 zeichen
 
  uart_gets( Line, sizeof( Line ) );
leider ist mir das mit dem *Buffer++ nicht ganz klar.
"Buffer" ist ja nur ein Zeiger auf Line. Bedeutet das, dass mit 
"*Buffer++ = xx;" das nächste Elemend in Line aufgerufen bzw. gesetzt 
wird?
Wenn ja. Warum dann ganz zum Schluss noch das "*Buffer = '\0'"? damit 
überschreibe ich mir ja dann das letzte Zeichen welches vor '\n' 
empfangen wurde?

Und andere dumme Frage, aber hat grad mal jemad ein Codebeispiel wie ich 
Line wieder auslese?

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*Buffer++ = x bedeutet, dass x an die Stelle geschrieben wird, wo Buffer 
hinzeigt, und Buffer danach um 1 erhöht wird.

>Wenn ja. Warum dann ganz zum Schluss noch das "*Buffer = '\0'"? damit
>überschreibe ich mir ja dann das letzte Zeichen welches vor '\n'
>empfangen wurde?

Nein, Buffer zeigt immer auf die nächste freie Stelle im String;

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was der Operator ++ macht gehört doch zu den ersten Sachen, die man in C 
lernt!

Ich frage mich häufiger, wie die Leute, die hier ständig aufschlagen, 
erwarten können, ohne jegliches Grundlagenwissen programmieren zu 
können!

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus wrote:
> Was der Operator ++ macht gehört doch zu den ersten Sachen, die man in C
> lernt!
>
> Ich frage mich häufiger, wie die Leute, die hier ständig aufschlagen,
> erwarten können, ohne jegliches Grundlagenwissen programmieren zu
> können!

Ich wills ja gerade lernen!

Deshalb hilft ja auch die 1. Antwort deutlich weiter. Danke.
was ++ macht weiß ich, nur dass es erst im nachhinein passiert, das 
wusste ich nicht.
Jetzt weiß ichs. Ich kann zwar immernoch nicht Programmieren, aber ich 
weiß deutlich mehr!

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans Wurst wrote:
> Klaus wrote:
>> Was der Operator ++ macht gehört doch zu den ersten Sachen, die man in C
>> lernt!
>>
>> Ich frage mich häufiger, wie die Leute, die hier ständig aufschlagen,
>> erwarten können, ohne jegliches Grundlagenwissen programmieren zu
>> können!
>
> Ich wills ja gerade lernen!
>
> Deshalb hilft ja auch die 1. Antwort deutlich weiter. Danke.
> was ++ macht weiß ich, nur dass es erst im nachhinein passiert, das
> wusste ich nicht.
> Jetzt weiß ichs. Ich kann zwar immernoch nicht Programmieren, aber ich
> weiß deutlich mehr!

Ja, ++ NACH einer Variable ist ein sogenannter Postfix Operator. Die 
Operation wird nach der Zuweisung ausgeführt.
Im Gegensatz dazu gibt es aber auch noch den Prefix Operator. Bei diesem 
ist das "++" vor der Variablen "++i". Dies bewirkt, dass das Inkrement 
VOR der Zuweisung ausgeführt wird.

Das ganze führt zu schmälerem Code, aber nach meiner persönlichen 
Meinung erhöht es die Lesbarkeit nicht wirklich, besonders für Anfänger.

Gute Nacht.

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.