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


von Leo B. (luigi)


Lesenswert?

Folgendes habe ich im AVR-GCC-Tutorial gefunden:
1
/* Zeichen empfangen */
2
uint8_t uart_getc(void)
3
{
4
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
5
        ;
6
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
7
}
8
 
9
void uart_gets( char* Buffer, uint8_t MaxLen )
10
{
11
  uint8_t NextChar;
12
  uint8_t StringLen = 0;
13
 
14
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
15
 
16
                                  // Sammle solange Zeichen, bis:
17
                                  // * entweder das String Ende Zeichen kam
18
                                  // * oder das aufnehmende Array voll ist
19
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
20
    *Buffer++ = NextChar;
21
    StringLen++;
22
    NextChar = uart_getc();
23
  }
24
 
25
                                  // Noch ein '\0' anhängen um einen Standard
26
                                  // C-String daraus zu machen
27
  *Buffer = '\0';
28
}
1
  char Line[40];      // String mit maximal 39 zeichen
2
 
3
  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?

von Mark .. (mork)


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;

von Klaus (Gast)


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!

von Leo B. (luigi)


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!

von Sebastian B. (mircobolle)


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.

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.